Springboot整合JPA配置多數據源流程詳解
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> <!-- 數據庫連接池 --> <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
在基本配置中,我們首先來配置多數據源基本信息以及DataSource,首先在application.yml中添加如下配置信息:
spring:
datasource:
# oracle數據庫配置
oracle:
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@10.0.66.72:1521:orcl
username: test
password: test
# mysql數據庫配置
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數據庫連接池
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
,這個注解一定不能少,否則在項目啟動時會出錯,@Primary表示當某一個類存在多個實例時,優(yōu)先使用哪個實例。
3. 多數據源配置
接下來配置Jpa的基本信息,這里兩個數據源,分別在兩個類中來配置,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
是系統(tǒng)提供的一個實例,里邊的數據就是我們在application.yml中配置的jpa相關的配置。HibernateProperties
用來手動設置數據源屬性,例如定義不同的數據庫方言。然后我們提供兩個Bean,分別是LocalContainerEntityManagerFactoryBean
和PlatformTransactionManager
事務管理器,不同于MyBatis和JdbcTemplate,在Jpa中,事務一定要配置。在提供LocalContainerEntityManagerFactoryBean的時候,需要指定packages,這里的packages指定的包就是這個數據源對應的實體類所在的位置,另外在這里配置類上通過@EnableJpaRepositories
注解指定dao所在的位置,以及LocalContainerEntityManagerFactoryBean和PlatformTransactionManager分別對應的引用的名字。
這樣第一個就配置好了,第二個基本和這個類似,主要有幾個不同點:
- dao的位置不同
- 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的位置不同
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操作不同的數據源。
到此這篇關于Springboot整合JPA配置多數據源流程詳解的文章就介紹到這了,更多相關Springboot配置多數據源內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Springboot3集成Knife4j的步驟以及使用(最完整版)
這篇文章主要介紹了Springboot3集成Knife4j的步驟以及使用的相關資料,Knife4j是一種增強Swagger的工具,支持黑色主題和更多配置選項,它與swagger-bootstrap-ui相比,提供了更現(xiàn)代的外觀和更多的功能,需要的朋友可以參考下2024-11-11JSON的String字符串與Java的List列表對象的相互轉換
這篇文章主要介紹了JSON的String字符串與Java的List列表對象的相互轉換,如果在瀏覽器端JSON是list則轉為string結構來處理,需要的朋友可以參考下2016-04-04Java中Comparable接口和Comparator接口的使用比較
Java中提供了兩種對集合或數組中元素進行排序的方法,一種是實現(xiàn)Comparable接口,另一種是實現(xiàn)Comparator接口,下面這篇文章主要給大家介紹了關于Java中Comparable接口和Comparator接口使用的相關資料,需要的朋友可以參考下2024-06-06Spring Security實現(xiàn)自定義訪問策略
本文介紹Spring Security實現(xiàn)自定義訪問策略,當根據誰訪問哪個域對象做出安全決策時,您可能需要一個自定義的訪問決策投票者,幸運的是,Spring Security有很多這樣的選項來實現(xiàn)訪問控制列表(ACL)約束,下面就來學習Spring Security自定義訪問策略,需要的朋友可以參考下2022-02-02