代码中使用 Druid 数据源,但是思想是想通的。
注:本文主要讲解使用Spring Data Jpa配置应用连接多数据源。
1. 配置文件内容
配置两个数据库信息:
在配置文件中,关键部分是在配置中增加了不同的前缀,标识不同的数据源。
# -------------------------------------------------
# DEV
#
# spring.datasource.druid.driverClassName 中间加上标识符(任意字符串)
# spring.datasource.druid.dev.driverClassName
# -------------------------------------------------
spring.datasource.druid.dev.driverClassName=oracle.jdbc.OracleDriver
spring.datasource.druid.dev.platform=oracle
spring.datasource.druid.dev.url=jdbc:oracle:thin:@192.168.56.10:1521:orcl
spring.datasource.druid.dev.username=TEST
spring.datasource.druid.dev.password=TEST
# -------------------------------------------------
# U8
# -------------------------------------------------
spring.datasource.druid.u8.driverClassName=oracle.jdbc.OracleDriver
spring.datasource.druid.u8.platform=oracle
spring.datasource.druid.u8.url=jdbc:oracle:thin:@192.168.56.40:1521:orcl
spring.datasource.druid.u8.username=TEST
spring.datasource.druid.u8.password=TEST
2. 配置类
要点在于:基础的数据源只有一个,在其中要使用@Primary
注解;对于其他的数据源,不可使用@Primary
注解,其他的配置大同小异。
2.1 基础数据源(主数据源)
/**
* DEV 环境数据源
*
* 作为基础数据源,所以在方法上有 @Primary 注解
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
// 实体管理器工厂Bean,要对应代码中的bean名称
entityManagerFactoryRef = "entityManagerFactoryDev",
// 事务管理器Bean,要对应代码中的bean名称
transactionManagerRef = "transactionManagerDev",
// 指定数据库对应的Repository类在哪个包下
basePackages = {"me.zhen.multidb.dev.*.repository"}
)
public class DataSourceDevConfig {
@Autowired
private HibernateProperties hibernateProperties;
@Resource
private JpaProperties jpaProperties;
/**
* 创建 DataSource bean
* 注意:注解 @Primary
*/
@Primary
@Bean(name = "dataSourceDev")
@ConfigurationProperties(prefix = "spring.datasource.druid.dev")
public DataSource dataSourceDev(){
return DruidDataSourceBuilder.create().build();
}
/**
* 创建实体管理器工厂Bean
*/
@Primary
@Bean(name = "entityManagerFactoryDev")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryDev(EntityManagerFactoryBuilder builder){
Map<String, Object> properties = hibernateProperties.determineHibernateProperties(
jpaProperties.getProperties(), new HibernateSettings());
return builder
.dataSource(dataSourceDev())
// 对应的实体类的目录
.packages("me.zhen.multidb.dev.*.entity")
.persistenceUnit("devPersistenceUnit")
.properties(properties)
.build();
}
/**
* 创建对应的实体管理器Bean
*/
@Primary
@Bean(name = "entityManagerDev")
public EntityManager entityManagerDev(EntityManagerFactoryBuilder builder){
return entityManagerFactoryDev(builder).getObject().createEntityManager();
}
/**
* 创建事务管理器Bean
*/
@Primary
@Bean(name = "transactionManagerDev")
public PlatformTransactionManager transactionManagerDev(EntityManagerFactoryBuilder builder){
return new JpaTransactionManager(entityManagerFactoryDev(builder).getObject());
}
}
2.2 其他数据源(从数据源)
/**
* U8 环境数据源
*
* 最大不同在于:不使用 @Primary 注解
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryU8",
transactionManagerRef = "transactionManagerU8",
basePackages = {"me.zhen.multidb.u8.*.repository"}
)
public class DataSourceU8Config {
@Resource
private HibernateProperties hibernateProperties;
@Resource
private JpaProperties jpaProperties;
@Bean(name = "dataSourceU8")
@ConfigurationProperties(prefix = "spring.datasource.druid.u8")
public DataSource dataSourceU8(){
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "entityManagerFactoryU8")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryU8(EntityManagerFactoryBuilder builder){
Map<String, Object> properties = hibernateProperties.determineHibernateProperties(
jpaProperties.getProperties(), new HibernateSettings());
return builder
.dataSource(dataSourceU8())
// 实体类的目录
.packages("me.zhen.multidb.u8.*.entity")
.persistenceUnit("u8PersistenceUnit")
.properties(properties)
.build();
}
@Bean(name = "entityManagerU8")
public EntityManager entityManagerU8(EntityManagerFactoryBuilder builder){
return entityManagerFactoryU8(builder).getObject().createEntityManager();
}
@Bean(name = "transactionManagerU8")
public PlatformTransactionManager transactionManagerU8(EntityManagerFactoryBuilder builder){
return new JpaTransactionManager(entityManagerFactoryU8(builder).getObject());
}
}
如果再有其他数据源需要连接,只需要在配置文件中,再添加一个数据源信息,然后拷贝上面的从数据源(对应上面的DataSourceU8Config
),修改里面的一下配置即可。