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進行實現的,無論主從,只要牽涉到多庫的都可以進行這樣解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章