前言
现在有的项目需要取不同数据库的数据,这时就需要多个数据源。spring框架已经很完善了,不需要我们再去配置繁琐的xml,我们只需要在配置文件中配置多个数据源,然后在不同的场景读取不同的数据信息就可以搞定。本篇文章将以分包的方式配置双数据源
正文
首先我们需要配置两个数据源,下面是以Mysql和PostGresql两个不同的数据库为例,配置信息的前缀需要不一致,以区分不同的数据源。
#主
spring.datasource.jdbc-url=jdbc:mysql://${DATA_BASE_IP_NAME:}?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=${DATA_BASE_USERNAME:}
spring.datasource.password=${DATA_BASE_PASSWORD:}
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.validation-timeout=3000
#从
spring.slave.datasource.jdbc-url=jdbc:postgresql://${DATA_BASE_IP_NAME_POSTGRE:}?searchpath=hrmw¤tSchema=hrmw&useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.slave.datasource.driver-class-name=org.postgresql.Driver
spring.slave.datasource.username=${DATA_BASE_USERNAME_POSTGRE:}
spring.slave.datasource.password=${DATA_BASE_PASSWORD_POSTGRE:
spring.slave.datasource.hikari.maximum-opol-size=10
spring.slave.datasource.hikari.connection-timeout=60000
spring.slave.datasource.hikari.validation-timeout=3000
然后就是需要配置文件来读取指定的数据源,DataSourceConfig 注入两个Bean的数据源,分别是master和slave,通过配置文件的前缀来读取。
@Configuration
public class DataSourceConfig {
@Bean("master")
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource(){
return DataSourceBuilder.create().build();
}
@Bean("slave")
@ConfigurationProperties(prefix = "spring.slave.datasource")
public DataSource dataSourceSlave(){
return DataSourceBuilder.create().build();
}
}
Spring除了数据源还需要事务管理器,所以我们需要给两个数据源分别配置两个数据管理器。MasterDataSourceConfig 主事务管理器对应master数据源,
SlaveDataSourceConfig 从事务管理器对应slave数据源
对于文中的两个basePackages 需要根据自己项目的分包情况修改。
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryMaster1",//配置连接工厂 entityManagerFactory
transactionManagerRef = "transactionManagerMaster1", //配置 事物管理器 transactionManager
basePackages = {"com.test.test.repository1"} //这个地方根据自己的模块修改
)
public class MasterDataSourceConfig {
@Autowired
@Qualifier("master")
private DataSource dataSourceMaster;
@Autowired
private JpaProperties jpaProperties;
@Bean("entityManagerMaster1")
@Primary
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryBean(builder).getObject().createEntityManager();
}
@Bean("entityManagerFactoryMaster1")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
return builder.dataSource(dataSourceMaster)
.properties(jpaProperties.getProperties())
.packages("com.test.test.pojo1") // 这个地方根据自己的模块修改
//持久化单元名称,当存在多个EntityManagerFactory时,需要制定此名称
.persistenceUnit("masterPersistenceUnit")
.build();
}
@Bean("transactionManagerMaster1")
@Primary
public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryBean(builder).getObject());
}
}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryMaster2",//配置连接工厂 entityManagerFactory
transactionManagerRef = "transactionManagerMaster2", //配置 事物管理器 transactionManager
basePackages = {"com.test.test.repository2"} //这个地方根据自己的模块修改
)
public class SlaveDataSourceConfig {
@Autowired
@Qualifier("slave")
private DataSource dataSourceSlave;
@Autowired
private JpaProperties jpaProperties;
@Bean("entityManagerMaster2")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryBean(builder).getObject().createEntityManager();
}
@Bean("entityManagerFactoryMaster2")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
return builder.dataSource(dataSourceSlave)
.properties(jpaProperties.getProperties())
.packages("com.test.test.pojo2") //这个地方根据自己的模块修改
//持久化单元名称,当存在多个EntityManagerFactory时,需要制定此名称
.persistenceUnit("slavePersistenceUnit")
.build();
}
@Bean("transactionManagerMaster2")
public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryBean(builder).getObject());
}
}
项目分包情况:
在pojo1和repository1中存放的是mysql库的项目的相关信息。
在pojo2和repository2中存放的是pg库的项目的相关信息。
根据包的全命名修改上面配置类的名称。
这样双数据源就配置完成了,mysql相关的sql写在pojo1和repository1中,pg相关的代码写在pojo2和repository2中,service层可以公用一个。这样就可以通过分包的方法配置双数据源。
结束
青春是有限的,智慧是无穷的,趁短的青春,去学习无穷的智慧,加油各位程序猿。