1,使用环境:SpringBoot 3.0.6
2,application.yml配置文件配置好数据源
spring:
datasource:
#第一个数据源
test1:
jdbc-url: jdbc:mysql://127.0.0.1:3306/test1?serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
#第二个数据源
test2:
jdbc-url: jdbc:mysql://127.0.0.1:3306/test2?serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
3,配置Config
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.boot.jdbc.DataSourceBuilder
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Primary
import org.springframework.data.jpa.repository.config.EnableJpaRepositories
import org.springframework.orm.jpa.JpaTransactionManager
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
import org.springframework.transaction.PlatformTransactionManager
import org.springframework.transaction.annotation.EnableTransactionManagement
import javax.sql.DataSource
@Configuration
class DataSourceConfig {
@Primary
@Bean(name = ["test1DataSource"])
@Qualifier("test1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test1")
fun systemDataSource(): DataSource {
return DataSourceBuilder.create().build()
}
@Bean(name = ["test2DataSource"])
@Qualifier("test2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test2")
fun messageDataSource(): DataSource {
return DataSourceBuilder.create().build()
}
}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "test1EntityManagerFactory",
transactionManagerRef = "test1TransactionManager",
basePackages = ["com.test1.repositorys"]
)
class Test1Config {
@Autowired
@Qualifier("test1DataSource")
lateinit var test1DataSource: DataSource
@Autowired
lateinit var jpaProperties: JpaProperties
@Autowired
lateinit var hibernateProperties: HibernateProperties
@Primary
@Bean(name = ["test1EntityManagerFactory"])
fun entityManagerFactory(builder: EntityManagerFactoryBuilder): LocalContainerEntityManagerFactoryBean {
val properties = hibernateProperties.determineHibernateProperties(jpaProperties.properties, HibernateSettings())
return builder.dataSource(test1DataSource).properties(properties)
.packages("com.test1.domains").build()
}
@Primary
@Bean(name = ["test1TransactionManager"])
fun systemTransactionManager(builder: EntityManagerFactoryBuilder): PlatformTransactionManager? {
return entityManagerFactory(builder).`object`?.let { JpaTransactionManager(it) }
}
}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "test2EntityManagerFactory",
transactionManagerRef = "test2TransactionManager",
basePackages = ["com.test2.repositorys"]
)
class Test2Config {
@Autowired
@Qualifier("test2DataSource")
lateinit var test2DataSource: DataSource
@Autowired
lateinit var jpaProperties: JpaProperties
@Autowired
lateinit var hibernateProperties: HibernateProperties
@Bean(name = ["test2EntityManagerFactory"])
fun entityManagerFactory(builder: EntityManagerFactoryBuilder): LocalContainerEntityManagerFactoryBean {
val properties = hibernateProperties.determineHibernateProperties(jpaProperties.properties, HibernateSettings())
return builder.dataSource(test2DataSource).properties(properties)
.packages("com.test2.domains").build()
}
@Bean(name = ["test2TransactionManager"])
fun systemTransactionManager(builder: EntityManagerFactoryBuilder): PlatformTransactionManager? {
return entityManagerFactory(builder).`object`?.let { JpaTransactionManager(it) }
}
}
4,使用
@Transactional(value = "test2TransactionManager")
@Autowired
@Qualifier("test2EntityManagerFactory")
lateinit var entityManager: EntityManager