SSH项目整合多数据源

这里以双数据源为例

前言

现在有的项目需要取不同数据库的数据,这时就需要多个数据源。spring框架已经很完善了,不需要我们再去配置繁琐的xml,我们只需要在配置文件中配置多个数据源,然后在不同的场景读取不同的数据信息就可以搞定。本篇文章将以分包的方式配置双数据源

正文

首先我们需要配置两个数据源,下面是以Mysql和PostGresql两个不同的数据库为例,配置信息的前缀需要不一致,以区分不同的数据源。

#主
spring.datasource.jdbc-url=jdbc:mysql://${DATA_BASE_IP_NAME:}?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=${DATA_BASE_USERNAME:}
spring.datasource.password=${DATA_BASE_PASSWORD:}
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.validation-timeout=3000
#从
spring.slave.datasource.jdbc-url=jdbc:postgresql://${DATA_BASE_IP_NAME_POSTGRE:}?searchpath=hrmw&currentSchema=hrmw&useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.slave.datasource.driver-class-name=org.postgresql.Driver
spring.slave.datasource.username=${DATA_BASE_USERNAME_POSTGRE:}
spring.slave.datasource.password=${DATA_BASE_PASSWORD_POSTGRE:
spring.slave.datasource.hikari.maximum-opol-size=10
spring.slave.datasource.hikari.connection-timeout=60000
spring.slave.datasource.hikari.validation-timeout=3000

然后就是需要配置文件来读取指定的数据源,DataSourceConfig 注入两个Bean的数据源,分别是master和slave,通过配置文件的前缀来读取。

@Configuration
public class DataSourceConfig {

    @Bean("master")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource(){
        return DataSourceBuilder.create().build();
    }
    @Bean("slave")
    @ConfigurationProperties(prefix = "spring.slave.datasource")
    public DataSource dataSourceSlave(){
        return DataSourceBuilder.create().build();
    }
}

Spring除了数据源还需要事务管理器,所以我们需要给两个数据源分别配置两个数据管理器。MasterDataSourceConfig 主事务管理器对应master数据源,
SlaveDataSourceConfig 从事务管理器对应slave数据源
对于文中的两个basePackages 需要根据自己项目的分包情况修改。

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactoryMaster1",//配置连接工厂 entityManagerFactory
        transactionManagerRef = "transactionManagerMaster1", //配置 事物管理器  transactionManager
        basePackages = {"com.test.test.repository1"}  //这个地方根据自己的模块修改
)
public class MasterDataSourceConfig {
    @Autowired
    @Qualifier("master")
    private DataSource dataSourceMaster;
    @Autowired
    private JpaProperties jpaProperties;

    @Bean("entityManagerMaster1")
    @Primary
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactoryBean(builder).getObject().createEntityManager();
    }
    @Bean("entityManagerFactoryMaster1")
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(dataSourceMaster)
                .properties(jpaProperties.getProperties())
                .packages("com.test.test.pojo1") // 这个地方根据自己的模块修改
                //持久化单元名称,当存在多个EntityManagerFactory时,需要制定此名称
                .persistenceUnit("masterPersistenceUnit")
                .build();

    }
    @Bean("transactionManagerMaster1")
    @Primary
    public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactoryBean(builder).getObject());
    }
}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactoryMaster2",//配置连接工厂 entityManagerFactory
        transactionManagerRef = "transactionManagerMaster2", //配置 事物管理器  transactionManager
        basePackages = {"com.test.test.repository2"} //这个地方根据自己的模块修改
)
public class SlaveDataSourceConfig {
    @Autowired
    @Qualifier("slave")
    private DataSource dataSourceSlave;
    @Autowired
    private JpaProperties jpaProperties;

    @Bean("entityManagerMaster2")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactoryBean(builder).getObject().createEntityManager();
    }
    @Bean("entityManagerFactoryMaster2")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(dataSourceSlave)
                .properties(jpaProperties.getProperties())
                .packages("com.test.test.pojo2") //这个地方根据自己的模块修改
                //持久化单元名称,当存在多个EntityManagerFactory时,需要制定此名称
                .persistenceUnit("slavePersistenceUnit")
                .build();

    }
    @Bean("transactionManagerMaster2")
    public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactoryBean(builder).getObject());
    }
}

项目分包情况:
在pojo1和repository1中存放的是mysql库的项目的相关信息。
在pojo2和repository2中存放的是pg库的项目的相关信息。
根据包的全命名修改上面配置类的名称。
在这里插入图片描述
这样双数据源就配置完成了,mysql相关的sql写在pojo1和repository1中,pg相关的代码写在pojo2和repository2中,service层可以公用一个。这样就可以通过分包的方法配置双数据源。

结束

青春是有限的,智慧是无穷的,趁短的青春,去学习无穷的智慧,加油各位程序猿。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值