spring boot 动态切换数据源-activiti库与业务库的自动切换

activiti 库与业务库的自动切换,也是属于数源切换,主从业务与基础数据库分离这些都时项目中经常遇到的数据源切换的问题。

eg: 最近在做工作流的项目中,项目选用了Activiti,又因为我们进行服务化开发activiti属于独立的服务项目,但是我们在走工作流程时需要记录操作,计时等需要进行操作,这时我们不得不把这些数据存到业务库中,activiti本身也是要构建自己的数据库,所以牵扯到多库,这时我们需要进行数据源的切换。实现如下。

一、配置文件

server.port=31098
## Properties配置
##主数据库
spring.datasource.primary.url=jdbc:mysql://127.0.0.1:3306/umale_discipline_activiti?     
useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
spring.datasource.primary.username= bbb
spring.datasource.primary.password=bbb
spring.datasource.primary.driverClassName=com.mysql.jdbc.Driver
spring.datasource.primary.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.primary.initialSize=5
spring.datasource.primary.minIdle=5
spring.datasource.primary.maxActive=60
spring.datasource.primary.maxWait=60000
spring.datasource.primary.timeBetweenEvictionRunsMillis=60000
spring.datasource.primary.minEvictableIdleTimeMillis=300000
spring.datasource.primary.testWhileIdle=false
spring.datasource.primary.testOnBorrow=true
spring.datasource.primary.testOnReturn=false
spring.datasource.primary.poolPreparedStatements=true
spring.datasource.primary.maxPoolPreparedStatementPerConnectionSize=20
 ##从数据库
spring.datasource.secondary.url=jdbc:mysql://127.0.0.1:3306/umale_discipline?
useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
spring.datasource.secondary.username= aaa
spring.datasource.secondary.password=aaaa
spring.datasource.secondary.driverClassName=com.mysql.jdbc.Driver
spring.datasource.secondary.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.secondary.initialSize=5
spring.datasource.secondary.minIdle=5
spring.datasource.secondary.maxActive=60
spring.datasource.secondary.maxWait=60000
spring.datasource.secondary.timeBetweenEvictionRunsMillis=60000
spring.datasource.secondary.minEvictableIdleTimeMillis=300000
spring.datasource.secondary.testWhileIdle=false
spring.datasource.secondary.testOnBorrow=true
spring.datasource.secondary.testOnReturn=false
spring.datasource.secondary.poolPreparedStatements=true
spring.datasource.secondary.maxPoolPreparedStatementPerConnectionSize=20
	## activiti default configuration
spring.activiti.database-schema-update: true
spring.activiti.check-process-definitions=true
spring.activiti.async-executor-enabled=false 
spring.activiti.job-executor-activate=false
spring.activiti.async-executor-activate=false
spring.activiti.process-definition-location-prefix: classpath:/processes/
spring.activiti.history-level=full

二、配置类

@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
    return DataSourceBuilder.create().type(DruidDataSource.class).build();
}

@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
    return DataSourceBuilder.create().type(DruidDataSource.class).build();
}
}
## 工作流库
@Configuration
public class PrimaryConfig extends AbstractProcessEngineAutoConfiguration {

@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;

@Primary
@Bean
public SpringProcessEngineConfiguration springProcessEngineConfiguration(
        PlatformTransactionManager transactionManager,
        SpringAsyncExecutor springAsyncExecutor) throws IOException {
    return baseSpringProcessEngineConfiguration(
            primaryDataSource,
            transactionManager,
            springAsyncExecutor);
}
}
## 业务库
@Configuration
@MapperScan(basePackages = "com.citycloud.inspection.order.dao",
    sqlSessionFactoryRef = "secondarySqlSessionFactory")
 public class SecondaryConfig {
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;
@Bean(name = "secondarySqlSessionFactory")
public SqlSessionFactory secondarySqlSessionFactory() throws Exception {
    SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
    sessionFactoryBean.setDataSource(secondaryDataSource);
    sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
            .getResources("classpath*:mapper/*.xml"));
    return sessionFactoryBean.getObject();
}
}

注意: 启动类别忘记加入@EnableAspectJAutoProxy,数据源切换也是基于AOP进行实现的,无论主从,只要牵涉到多库的都可以进行这样解决。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值