當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring Data JPA 从入门到精通~如何配置多数据源
生活随笔
收集整理的這篇文章主要介紹了
Spring Data JPA 从入门到精通~如何配置多数据源
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如何配置多數據源
在 application.properties 中定義兩個 DataSource
定義兩個 DataSource 用來讀取 application.properties 中的不同配置。如下例子中,主數據源配置為 spring.datasource.one 開頭的配置,第二數據源配置為 spring.datasource.two 開頭的配置。
//這是默認配置,我們做一下對比 spring.datasource.url=db1 spring.datasource.username=db1_username spring.datasource.password=db1_password //# Druid 數據源配置,繼承spring.datasource.* 配置,相同則覆蓋 ... spring.datasource.druid.initial-size=5 spring.datasource.druid.max-active=5 ...//#Druid 數據源 1 配置,繼承spring.datasource.druid.* 配置,相同則覆蓋 //#db1的配置會上面的配置 ... spring.datasource.druid.one.url=db1 spring.datasource.druid.one.username=db1_username spring.datasource.druid.one.password=db1_password spring.datasource.druid.one.max-active=10 spring.datasource.druid.one.max-wait=10000 ... //# Druid 數據源 2 配置,繼承spring.datasource.druid.* 配置,相同則覆蓋 ... spring.datasource.druid.two.url=db2 spring.datasource.druid.two.username=db2_username spring.datasource.druid.two.password=db2_password spring.datasource.druid.two.max-active=20 spring.datasource.druid.two.max-wait=20000 ...定義兩個 DataSourceConfigJava 類
兩個 DataSourceConfig 類內容如下:
@Configuration @EnableTransactionManagement @EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactoryOne",transactionManagerRef="transactionManagerOne",basePackages= { "com.jackzhang.example.one" }) //設置Repository所在位置 @EnableConfigurationProperties(JpaProperties.class) public class DataSourceOneConfig {/*** 配置數據源1*/@Primary@Bean(name = "dataSourceOne")@ConfigurationProperties("spring.datasource.druid.one")public DataSource dataSourceOne(){return DruidDataSourceBuilder.create().build();}@Autowired@Qualifier("dataSourceOne")private DataSource oneDataSource;@Primary@Bean(name = "entityManagerOne")public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactoryOne(builder).getObject().createEntityManager();}@Primary@Bean(name = "entityManagerFactoryOne")public LocalContainerEntityManagerFactoryBean entityManagerFactoryOne (EntityManagerFactoryBuilder builder) {return builder.dataSource(oneDataSource).properties(getVendorProperties(oneDataSource)).packages("com.jackzhang.example.one") //設置實體類所在位置.persistenceUnit("onePersistenceUnit").build();}@Autowiredprivate JpaProperties jpaProperties;private Map<String, String> getVendorProperties(DataSource dataSource) {return jpaProperties.getHibernateProperties(dataSource);}@Primary@Bean(name = "transactionManagerOne")public PlatformTransactionManager transactionManagerOne(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactoryOne(builder).getObject());} } @Configuration @EnableTransactionManagement @EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactoryTwo",transactionManagerRef="transactionManagerTwo",basePackages= { "com.jackzhang.example.two" }) //設置Repository所在位置 @EnableConfigurationProperties(JpaProperties.class) public class DataSourceTwoConfig {/*** 配置數據源2*/@Primary@Bean(name = "dataSourceTwo")@ConfigurationProperties("spring.datasource.druid.two")public DataSource dataSourceTwo(){return DruidDataSourceBuilder.create().build();}@Autowired@Qualifier("dataSourceTwo")private DataSource twoDataSource;@Primary@Bean(name = "entityManagerTwo")public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactoryTwo(builder).getObject().createEntityManager();}@Primary@Bean(name = "entityManagerFactoryTwo")public LocalContainerEntityManagerFactoryBean entityManagerFactoryTwo (EntityManagerFactoryBuilder builder) {return builder.dataSource(twoDataSource).properties(getVendorProperties(twoDataSource)).packages("com.jackzhang.example.two") //設置實體類所在位置.persistenceUnit("twoPersistenceUnit").build();}@Autowiredprivate JpaProperties jpaProperties;private Map<String, String> getVendorProperties(DataSource dataSource) {return jpaProperties.getHibernateProperties(dataSource);}@Primary@Bean(name = "transactionManagerTwo")public PlatformTransactionManager transactionManagerTwo(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactoryTwo(builder).getObject());} }我們發現 DataSourceTwoConfig、DataSourceOneConfig 內容基本一樣,思路就是管理兩套 datasource,從而帶來了兩套 transactionManager,分別在這兩個 package 下創建各自的實體和數據訪問接口即可。當然了也可以通過 @Transactional(rollbackFor = Exception.class, transactionManager= "transactionManagerOne") 來手動選擇哪個數據源。
多數據源的場景
隨著微服務的推行,其實很少有多數據源的場景的,作者不建議出現多數據源,當出現的時候就要想想,模塊劃分的是否合理,是否可以通過服務去解決,但不排除 Job 等。
總結
以上是生活随笔為你收集整理的Spring Data JPA 从入门到精通~如何配置多数据源的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Effective Java~2.Bui
- 下一篇: JS中实现replaceAll的方法