Springboot+jpa異なるデータベースのマルチデータソース構成を実現
5969 ワード
くだらないことは言わないで、配置を直接見ます!
1、application.yml
プロファイルは、上記のように、2つのデータベースのリンクとデータベースに対応する方言をそれぞれ定義します.
2、データソースの構成
コード解析:1、2つのデータソースはそれぞれymlファイルに配置されたデータソースに対応する2、@Bean注記を使用して対応方法を後で使用するために配布する
3、異なるデータソースの役割ドメインを定義する
マルチデータソース構成1)
マルチデータソース構成2)
これで、すべての構成が完了し、構成スキャンされたすべての@Entityクラスが異なるデータベースに対応します.
1、application.yml
#
#primary
spring:
primary:
datasource:
url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/dico_dev?autoReconnect=true&autoReconnectForPools=true&useUnicode=true&characterEncoding=UTF-8&useSSL=true
username: root
password: xxxx
driver-class-name: com.mysql.jdbc.Driver
#secondary
secondary:
datasource:
url: jdbc:sqlserver://xxx.xxx.xxxx.xxx:1433;databasename=LZMISportal
username: root
password: xxxx
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
jpa:
hibernate:
primary-dialect: org.hibernate.dialect.MySQL5Dialect
secondary-dialect: org.hibernate.dialect.SQLServer2008Dialect
open-in-view: true
show-sql: true
プロファイルは、上記のように、2つのデータベースのリンクとデータベースに対応する方言をそれぞれ定義します.
2、データソースの構成
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@Primary
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix = "spring.primary.datasource")
public DataSource primaryDatasource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
@ConfigurationProperties(prefix = "spring.secondary.datasource")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
コード解析:1、2つのデータソースはそれぞれymlファイルに配置されたデータソースに対応する2、@Bean注記を使用して対応方法を後で使用するために配布する
3、異なるデータソースの役割ドメインを定義する
マルチデータソース構成1)
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryPrimary",// entityManagerFactory
transactionManagerRef = "transactionManagerPrimary", // transactionManager
basePackages = {"xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx"}//
)
public class PrimaryConfig {
@Autowired
private JpaProperties jpaProperties;
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;//
@Value("${spring.jpa.hibernate.primary-dialect}")
private String primaryDialect;//
/**
*
* @param builder
* @return
*/
@Bean(name = "entityManagerFactoryPrimary")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
return builder
//
.dataSource(primaryDataSource)
//
.properties(getVendorProperties(primaryDataSource))
// . @Entity
.packages("xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx","xxx.xxx.xxx.xxx")
// Spring EntityManagerFactory Repository . EntityManagerFactory ,
// Repository EntityManager , EntityManager
.persistenceUnit("primaryPersistenceUnit")
.build();
}
private Map getVendorProperties(DataSource dataSource) {
Map map = new HashMap<>();
map.put("hibernate.dialect",primaryDialect);//
jpaProperties.setProperties(map);
return jpaProperties.getHibernateProperties(dataSource);
}
/**
*
*
* @param builder
* @return
*/
@Bean(name = "transactionManagerPrimary")
@Primary
PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
}
}
マルチデータソース構成2)
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerFactorySecondary",
transactionManagerRef="transactionManagerSecondary",
basePackages= { "xxx.xxx.xxx.xxx" })
public class SecondaryConfig {
@Autowired
private JpaProperties jpaProperties;
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;
@Value("${spring.jpa.hibernate.secondary-dialect}")
private String secondaryDialect;
@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)
.properties(getVendorProperties(secondaryDataSource))
.packages("xxx.xxx.xxx.xxx")
.persistenceUnit("secondaryPersistenceUnit")
.build();
}
private Map getVendorProperties(DataSource dataSource) {
Map map = new HashMap<>();
map.put("hibernate.dialect",secondaryDialect);
jpaProperties.setProperties(map);
return jpaProperties.getHibernateProperties(dataSource);
}
@Bean(name = "transactionManagerSecondary")
PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
}
}
これで、すべての構成が完了し、構成スキャンされたすべての@Entityクラスが異なるデータベースに対応します.