JPA的多mysql數(shù)據(jù)源配置
- 配置文件
配置文件 application.yml 增加備用庫的設置如下:
- 配置文件
spring:
datasource:
# driver-class-name: com.mysql.jdbc.Driver 老版
primary:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 12345678
# 一定是jdbc-url 要不然報錯 數(shù)據(jù)源連接配置2.x和1.x的配置項是有區(qū)別的:2.x使用jdbc-url溃斋,
# 而1.x版本使用 url铛碑。
jdbc-url: jdbc:mysql://x.x.x.x:13306/your_primary_sql_name?charterEncoding=utf-8&useSSl=false&serverTimezone=Asia/Shanghai
secondary:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 12345678
jdbc-url: jdbc:mysql://y.y.y.y:13306/you_secondary_sql_name?charterEncoding=utf-8&useSSl=false&serverTimezone=Asia/Shanghai
注意:如果你在配置的時候發(fā)生了這個報錯java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName. 就是url配置項錯誤非驮。2.x版本下吐句,url配置項名稱應該為jdbc-url。
- 創(chuàng)建一個多數(shù)據(jù)源的配置類加載上述數(shù)據(jù)源配置
比如我新建一個配置類:DataSourceConfig,內容如下:
- 創(chuàng)建一個多數(shù)據(jù)源的配置類加載上述數(shù)據(jù)源配置
@Configuration
public class DataSourceConfig {
// @Primary注解指定了主數(shù)據(jù)源,就是當我們不特別指定哪個數(shù)據(jù)源的時候,就會使用這個Bean
@Primary
@Bean
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
- 數(shù)據(jù)源primary配置類
新建數(shù)據(jù)源primary配置類:JpaConfigPrimary谤饭,內容如下:
- 數(shù)據(jù)源primary配置類
@Configuration
/* 使用 @EnableTransactionManagement 注解來進行 JPA 的配置,該注解中主要配置了三個屬性:
basePackages 用來指定 Repository 所在的位置(可以配置多個包)胖笛。
entityManagerFactoryRef 用來指定實體類管理工廠 Bean 的名稱网持。
transactionManagerRef 用來指定事物管理器的引用名稱,這里的引用名稱就是 JpaConfigOne 類中注冊的 Bean 的名稱(默認的 Bean 名稱為方法名)
*/
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactoryPrimary",
transactionManagerRef="transactionManagerPrimary",
basePackages = {"com.tony.miaosuan.repository"})
public class JpaConfigPrimary {
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;
@Autowired
private JpaProperties jpaProperties;
@Autowired
private HibernateProperties hibernateProperties;
private Map<String, Object> getVendorProperties() {
return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
}
@Primary
@Bean(name = "entityManagerPrimary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
}
@Primary
@Bean(name = "entityManagerFactoryPrimary")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {
return builder
.dataSource(primaryDataSource)
.packages("com.tony.miaosuan.model") //設置實體類所在位置
.persistenceUnit("primaryPersistenceUnit")
.properties(getVendorProperties())
.build();
}
@Primary
@Bean(name = "transactionManagerPrimary")
public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
}
}
- 數(shù)據(jù)源secondary配置類
新建數(shù)據(jù)源secondary配置類:JpaConfigSecondary长踊,內容如下:
- 數(shù)據(jù)源secondary配置類
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactorySecondary",
transactionManagerRef="transactionManagerSecondary",
basePackages = {"com.tony.miaosuan.repository2"})
public class JpaConfigSencondary {
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;
@Autowired
private JpaProperties jpaProperties;
@Autowired
private HibernateProperties hibernateProperties;
private Map<String, Object> getVendorProperties() {
return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
}
@Bean(name = "entityManagerSecondary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactorySecondary(builder).getObject().createEntityManager();
}
@Bean(name = "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {
return builder
.dataSource(secondaryDataSource)
.packages("com.tony.miaosuan.model2") //設置實體類所在位置
.persistenceUnit("secondaryPersistenceUnit")
.properties(getVendorProperties())
.build();
}
@Bean(name = "transactionManagerSecondary")
PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
}
}