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
接下來配置兩個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
,這個注解一定不能少,否則在項(xiàng)目啟動時會出錯,@Primary表示當(dāng)某一個類存在多個實(shí)例時,優(yōu)先使用哪個實(shí)例。
3. 多數(shù)據(jù)源配置
接下來配置Jpa的基本信息,這里兩個數(shù)據(jù)源,分別在兩個類中來配置,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)提供的一個實(shí)例,里邊的數(shù)據(jù)就是我們在application.yml中配置的jpa相關(guān)的配置。HibernateProperties
用來手動設(shè)置數(shù)據(jù)源屬性,例如定義不同的數(shù)據(jù)庫方言。然后我們提供兩個Bean,分別是LocalContainerEntityManagerFactoryBean
和PlatformTransactionManager
事務(wù)管理器,不同于MyBatis和JdbcTemplate,在Jpa中,事務(wù)一定要配置。在提供LocalContainerEntityManagerFactoryBean的時候,需要指定packages,這里的packages指定的包就是這個數(shù)據(jù)源對應(yīng)的實(shí)體類所在的位置,另外在這里配置類上通過@EnableJpaRepositories
注解指定dao所在的位置,以及LocalContainerEntityManagerFactoryBean和PlatformTransactionManager分別對應(yīng)的引用的名字。
這樣第一個就配置好了,第二個基本和這個類似,主要有幾個不同點(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-11SpringMVC攔截器實(shí)現(xiàn)登錄認(rèn)證
這篇文章主要介紹了SpringMVC攔截器實(shí)現(xiàn)登錄認(rèn)證的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11關(guān)于java開發(fā)的性能問題總結(jié)(必看)
下面小編就為大家?guī)硪黄P(guān)于java開發(fā)的性能問題總結(jié)(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03Springboot 讀取 yml 配置文件里的參數(shù)值
本文主要介紹了Springboot 讀取 yml 配置文件里的參數(shù)值,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12JSON的String字符串與Java的List列表對象的相互轉(zhuǎn)換
這篇文章主要介紹了JSON的String字符串與Java的List列表對象的相互轉(zhuǎn)換,如果在瀏覽器端JSON是list則轉(zhuǎn)為string結(jié)構(gòu)來處理,需要的朋友可以參考下2016-04-04CAT分布式實(shí)時監(jiān)控系統(tǒng)使用詳解
這篇文章主要為大家介紹了CAT分布式實(shí)時監(jiān)控系統(tǒng)介紹詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Java中Comparable接口和Comparator接口的使用比較
Java中提供了兩種對集合或數(shù)組中元素進(jìn)行排序的方法,一種是實(shí)現(xiàn)Comparable接口,另一種是實(shí)現(xiàn)Comparator接口,下面這篇文章主要給大家介紹了關(guān)于Java中Comparable接口和Comparator接口使用的相關(guān)資料,需要的朋友可以參考下2024-06-06Spring Security實(shí)現(xiàn)自定義訪問策略
本文介紹Spring Security實(shí)現(xiàn)自定義訪問策略,當(dāng)根據(jù)誰訪問哪個域?qū)ο笞龀霭踩珱Q策時,您可能需要一個自定義的訪問決策投票者,幸運(yùn)的是,Spring Security有很多這樣的選項(xiàng)來實(shí)現(xiàn)訪問控制列表(ACL)約束,下面就來學(xué)習(xí)Spring Security自定義訪問策略,需要的朋友可以參考下2022-02-02