Spring Data JPA 从入门到精通~如何配置多数据源

37 篇文章 10 订阅

如何配置多数据源

在 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();
   }
   @Autowired
   private 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();
   }
   @Autowired
   private 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 等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值