Springboot整合JPA配置多數(shù)據(jù)源流程詳解
1. Maven
<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>
<!-- 數(shù)據(jù)庫連接池 -->
<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. 基本配置
DataSource
在基本配置中,我們首先來配置多數(shù)據(jù)源基本信息以及DataSource,首先在application.yml中添加如下配置信息:
spring:
datasource:
# oracle數(shù)據(jù)庫配置
oracle:
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@10.0.66.72:1521:orcl
username: test
password: test
# mysql數(shù)據(jù)庫配置
mysql:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.0.66.60: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數(shù)據(jù)庫連接池
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
接下來配置兩個(gè)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,這個(gè)注解一定不能少,否則在項(xiàng)目啟動(dòng)時(shí)會出錯(cuò),@Primary表示當(dāng)某一個(gè)類存在多個(gè)實(shí)例時(shí),優(yōu)先使用哪個(gè)實(shí)例。
3. 多數(shù)據(jù)源配置
接下來配置Jpa的基本信息,這里兩個(gè)數(shù)據(jù)源,分別在兩個(gè)類中來配置,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();
}
/**
* 設(shè)置數(shù)據(jù)源屬性
*
* @return
*/
private Map<String, Object> getVendorProperties() {
Map<String, String> map = new HashMap<>();
// 設(shè)置oracle數(shù)據(jù)庫方言
map.put("hibernate.dialect", oracleDialect);
map.put("show-sql", showSql);
jpaProperties.setProperties(map);
return hibernateProperties.determineHibernateProperties(
jpaProperties.getProperties(), new HibernateSettings());
}
/**
* 配置事務(wù)管理器
*
* @param builder
* @return
*/
@Bean
PlatformTransactionManager platformTransactionManagerOracle(EntityManagerFactoryBuilder builder) {
LocalContainerEntityManagerFactoryBean factoryBeanOracle = localContainerEntityManagerFactoryBeanOracle(builder);
return new JpaTransactionManager(factoryBeanOracle.getObject());
}
}配置說明:JpaProperties是系統(tǒng)提供的一個(gè)實(shí)例,里邊的數(shù)據(jù)就是我們在application.yml中配置的jpa相關(guān)的配置。HibernateProperties用來手動(dòng)設(shè)置數(shù)據(jù)源屬性,例如定義不同的數(shù)據(jù)庫方言。然后我們提供兩個(gè)Bean,分別是LocalContainerEntityManagerFactoryBean和PlatformTransactionManager事務(wù)管理器,不同于MyBatis和JdbcTemplate,在Jpa中,事務(wù)一定要配置。在提供LocalContainerEntityManagerFactoryBean的時(shí)候,需要指定packages,這里的packages指定的包就是這個(gè)數(shù)據(jù)源對應(yīng)的實(shí)體類所在的位置,另外在這里配置類上通過@EnableJpaRepositories注解指定dao所在的位置,以及LocalContainerEntityManagerFactoryBean和PlatformTransactionManager分別對應(yīng)的引用的名字。
這樣第一個(gè)就配置好了,第二個(gè)基本和這個(gè)類似,主要有幾個(gè)不同點(diǎn):
- dao的位置不同
- persistenceUnit不同
- 相關(guān)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();
}
/**
* 設(shè)置數(shù)據(jù)源屬性
*
* @return
*/
private Map<String, Object> getVendorProperties() {
Map<String, String> map = new HashMap<>();
// 設(shè)置mysql數(shù)據(jù)庫方言
map.put("hibernate.dialect", mysqlDialect);
map.put("show-sql", showSql);
jpaProperties.setProperties(map);
return hibernateProperties.determineHibernateProperties(
jpaProperties.getProperties(), new HibernateSettings());
}
/**
* 配置事務(wù)管理器
*
* @param builder
* @return
*/
@Bean
PlatformTransactionManager platformTransactionManagerMysql(EntityManagerFactoryBuilder builder) {
LocalContainerEntityManagerFactoryBean factoryBeanMysql = localContainerEntityManagerFactoryBeanMysql(builder);
return new JpaTransactionManager(factoryBeanMysql.getObject());
}
}4. Dao層接口
接下來,在對應(yīng)位置分別提供相關(guān)的實(shí)體類和dao即可,注意:實(shí)體類可以共用,dao的位置不同
oracle接口:
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);
}到此,所有的配置就算完成了,接下來就可以在Service中注入不同的Dao,不同的Dao操作不同的數(shù)據(jù)源。
到此這篇關(guān)于Springboot整合JPA配置多數(shù)據(jù)源流程詳解的文章就介紹到這了,更多相關(guān)Springboot配置多數(shù)據(jù)源內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot3集成Knife4j的步驟以及使用(最完整版)
這篇文章主要介紹了Springboot3集成Knife4j的步驟以及使用的相關(guān)資料,Knife4j是一種增強(qiáng)Swagger的工具,支持黑色主題和更多配置選項(xiàng),它與swagger-bootstrap-ui相比,提供了更現(xiàn)代的外觀和更多的功能,需要的朋友可以參考下2024-11-11
SpringMVC攔截器實(shí)現(xiàn)登錄認(rèn)證
這篇文章主要介紹了SpringMVC攔截器實(shí)現(xiàn)登錄認(rèn)證的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
關(guān)于java開發(fā)的性能問題總結(jié)(必看)
下面小編就為大家?guī)硪黄P(guān)于java開發(fā)的性能問題總結(jié)(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
Springboot 讀取 yml 配置文件里的參數(shù)值
本文主要介紹了Springboot 讀取 yml 配置文件里的參數(shù)值,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
JSON的String字符串與Java的List列表對象的相互轉(zhuǎn)換
這篇文章主要介紹了JSON的String字符串與Java的List列表對象的相互轉(zhuǎn)換,如果在瀏覽器端JSON是list則轉(zhuǎn)為string結(jié)構(gòu)來處理,需要的朋友可以參考下2016-04-04
CAT分布式實(shí)時(shí)監(jiān)控系統(tǒng)使用詳解
這篇文章主要為大家介紹了CAT分布式實(shí)時(shí)監(jiān)控系統(tǒng)介紹詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Java中Comparable接口和Comparator接口的使用比較
Java中提供了兩種對集合或數(shù)組中元素進(jìn)行排序的方法,一種是實(shí)現(xiàn)Comparable接口,另一種是實(shí)現(xiàn)Comparator接口,下面這篇文章主要給大家介紹了關(guān)于Java中Comparable接口和Comparator接口使用的相關(guān)資料,需要的朋友可以參考下2024-06-06
Spring Security實(shí)現(xiàn)自定義訪問策略
本文介紹Spring Security實(shí)現(xiàn)自定義訪問策略,當(dāng)根據(jù)誰訪問哪個(gè)域?qū)ο笞龀霭踩珱Q策時(shí),您可能需要一個(gè)自定義的訪問決策投票者,幸運(yùn)的是,Spring Security有很多這樣的選項(xiàng)來實(shí)現(xiàn)訪問控制列表(ACL)約束,下面就來學(xué)習(xí)Spring Security自定義訪問策略,需要的朋友可以參考下2022-02-02

