1、运行环境
Kotlin、SpringBoot(1.5.13)、Hibernate5、Druid
备注:需要JAVA的同学可以根据插件或者自己转成JAVA,这里提供一个配置的思路
2、配置文件(application.yml)
spring:
application:
name: clangs
datasource:
hj:
password: password
name: hjDataSource
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: @spring.hj.datasource.url@&useSSL=true&verifyServerCertificate=false
username: username
gym:
password: password
name: gymDataSource
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: @spring.gym.datasource.url@&useSSL=true&verifyServerCertificate=false
username: username
druid:
min-idle: 10
test-while-idle: true
max-active: 30
validation-query: select 1
initial-size: 10
connection-init-sqls: set names utf8mb4
default-auto-commit: false
jpa:
show-sql: true
open-in-view: false
hibernate:
use-new-id-generator-mappings: true
database-platform: MySQL5InnoDB
properties:
hibernate:
current_session_context_class: org.springframework.orm.hibernate5.SpringSessionContext
备注:根据需要酌情修改
3、切换数据源思路
分别注册配置文件中提到的数据源,之后注册routingDataSource(DynamicDataSource),把上述数据源写入routingDataSource(DynamicDataSource)。切换数据源的时机是Controller执行时,用AOP做这件事,在切面里可以通过RequestContextHolder获取Request,有了Request就可以获取域名了,根据域名设定ThreadLocal的值,DynamicDataSource通过利用ThreadLocal来切换。
4、代码
/**
* Jpa、Hibernate5等的上下文配置
*/
@Configuration
@Import(DataSourceConfig::class, JpaEntityManager::class)
open class ContextConfig {
@Bean
open fun sessionFactory(@Qualifier("entityManagerFactory") emf: EntityManagerFactory): SessionFactory {
return emf.unwrap(SessionFactory::class.java)
}
@Bean("transactionManager")
open fun transactionManager(@Qualifier("sessionFactory") sessionFactory: SessionFactory) = HibernateTransactionManager().apply