Springboot は JPA の複数のデータソースを統合します
1.メイヴン
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.9</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
2. 基本構成
2.1 データソース
基本構成では、まず複数のデータ ソースと DataSource の基本情報を構成し、最初に次の構成情報を application.yml に追加します。
spring:
datasource:
# oracle数据库配置
oracle:
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@localhost:1521:orcl
username: test
password: test
# mysql数据库配置
mysql:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/swap_business_db?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
# druid数据库连接池
druid:
filters: stat
initialSize: 5
maxActive: 20
maxPoolPreparedStatementPerConnectionSize: 20
maxWait: 60000
minEvictableIdleTimeMillis: 30000
minIdle: 5
poolPreparedStatements: false
testOnBorrow: false
testOnReturn: false
testWhileIdle: true
timeBetweenEvictionRunsMillis: 60000
#Oracle模式
validation-query: SELECT 1 FROM DUAL #用来检测连接是否有效的sql
#MySQL模式
validation-queryM: SELECT 1 #用来检测连接是否有效的sql
jpa:
hibernate:
ddl-auto: none
oracle-dialect: org.hibernate.dialect.Oracle10gDialect
mysql-dialect: org.hibernate.dialect.MySQL8Dialect
show-sql: false
次に、次のように 2 つの DataSource を構成します。
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.oracle")
@Primary
DataSource dsOracle() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.mysql")
DataSource dsMysql() {
return DruidDataSourceBuilder.create().build();
}
}
注:@Primary
この注釈は、欠落していてはなりません。そうしないと、プロジェクトの開始時にエラーが発生します。@Primary は、特定のクラスのインスタンスが複数ある場合に、どのインスタンスが最初に使用されるかを示します。
3. 複数のデータ ソース構成
次に、Jpaの基本情報を設定します.ここでは、2つのデータソースをそれぞれ2つのクラスで設定します.oracleとmysqlの設定は次のとおりです.
3.1 JpaConfigOracle
@Configuration
@EnableJpaRepositories(basePackages = "cn.piesat.dao.oracle",
entityManagerFactoryRef = "localContainerEntityManagerFactoryBeanOracle",
transactionManagerRef = "platformTransactionManagerOracle")
public class JpaConfigOracle {
@Autowired
@Qualifier(value = "dsOracle")
DataSource dsOracle;
@Autowired
JpaProperties jpaProperties;
@Autowired
private HibernateProperties hibernateProperties;
@Value("${spring.jpa.hibernate.oracle-dialect}")
private String oracleDialect;
@Value("${spring.jpa.show-sql}")
private String showSql;
@Bean
@Primary
LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBeanOracle(EntityManagerFactoryBuilder builder) {
return builder.dataSource(dsOracle)
.packages("cn.piesat.model")
.properties(getVendorProperties())
.persistenceUnit("pu1")
.build();
}
/**
* 设置数据源属性
*
* @return
*/
private Map<String, Object> getVendorProperties() {
Map<String, String> map = new HashMap<>();
// 设置oracle数据库方言
map.put("hibernate.dialect", oracleDialect);
map.put("show-sql", showSql);
jpaProperties.setProperties(map);
return hibernateProperties.determineHibernateProperties(
jpaProperties.getProperties(), new HibernateSettings());
}
/**
* 配置事务管理器
*
* @param builder
* @return
*/
@Bean
PlatformTransactionManager platformTransactionManagerOracle(EntityManagerFactoryBuilder builder) {
LocalContainerEntityManagerFactoryBean factoryBeanOracle = localContainerEntityManagerFactoryBeanOracle(builder);
return new JpaTransactionManager(factoryBeanOracle.getObject());
}
}
設定説明:JpaProperties
システム提供の例で、内部のデータはapplication.ymlで設定したjpa関連の設定です。HibernateProperties
さまざまなデータベースの方言を定義するなど、データ ソース プロパティを手動で設定するために使用されます。次に、MyBatis と JdbcTemplateとは異なる2 つの Bean、つまりLocalContainerEntityManagerFactoryBean
トランザクションマネージャーを提供します。LocalContainerEntityManagerFactoryBean を提供する場合は、パッケージを指定する必要があります.ここで指定するパッケージは、このデータ ソースに対応するエンティティ クラスの場所です.また、dao の場所は、ここで構成クラスのアノテーションによって指定され、LocalContainerEntityManagerFactoryBean に対応する参照および PlatformTransactionManagerそれぞれの名前。PlatformTransactionManager
@EnableJpaRepositories
このようにして、最初のものは構成され、2 番目のものは基本的にこれと似ていますが、いくつかの主な違いがあります。
- ダオの場所が違う
- persistenceUnit が異なります
- 関連する Bean の名前が異なります
3.2 JpaConfigMysql
@Configuration
@EnableJpaRepositories(basePackages = "cn.piesat.dao.mysql",
entityManagerFactoryRef = "localContainerEntityManagerFactoryBeanMysql",
transactionManagerRef = "platformTransactionManagerMysql")
public class JpaConfigMysql {
@Autowired
@Qualifier(value = "dsMysql")
DataSource dsMysql;
@Autowired
JpaProperties jpaProperties;
@Autowired
private HibernateProperties hibernateProperties;
@Value("${spring.jpa.hibernate.mysql-dialect}")
private String mysqlDialect;
@Value("${spring.jpa.show-sql}")
private String showSql;
@Bean
LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBeanMysql(EntityManagerFactoryBuilder builder) {
return builder.dataSource(dsMysql)
.packages("cn.piesat.model")
.properties(getVendorProperties())
.persistenceUnit("pu2")
.build();
}
/**
* 设置数据源属性
*
* @return
*/
private Map<String, Object> getVendorProperties() {
Map<String, String> map = new HashMap<>();
// 设置mysql数据库方言
map.put("hibernate.dialect", mysqlDialect);
map.put("show-sql", showSql);
jpaProperties.setProperties(map);
return hibernateProperties.determineHibernateProperties(
jpaProperties.getProperties(), new HibernateSettings());
}
/**
* 配置事务管理器
*
* @param builder
* @return
*/
@Bean
PlatformTransactionManager platformTransactionManagerMysql(EntityManagerFactoryBuilder builder) {
LocalContainerEntityManagerFactoryBean factoryBeanMysql = localContainerEntityManagerFactoryBeanMysql(builder);
return new JpaTransactionManager(factoryBeanMysql.getObject());
}
}
4. Dao レイヤー インターフェイス
次に、関連するエンティティ クラスと dao を対応する位置に指定します。注:エンティティ クラスは共有できますが、dao の位置は異なります。
オラクルのインターフェース:
package cn.piesat.dao.oracle;
public interface TMasOrbitInfoDao extends JpaRepository<TMasOrbitInfo, String> {
List<TMasOrbitInfo> findBySatelliteAndObservationDateBetween(String satellite, String start, String end);
}
mysql インターフェース:
package cn.piesat.dao.mysql;
public interface SwapBusinessEfficiencyMainDao extends JpaRepository<SwapBusinessEfficiencyMain, String> {
List<SwapBusinessEfficiencyMain> findByDataIdentifyAndDataTimeBetween(String identify, String start, String end);
}
この時点で、すべての構成が完了し、さまざまな Daos をサービスに注入できます。さまざまな Daos がさまざまなデータ ソースを操作します。