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进行实现的,无论主从,只要牵涉到多库的都可以进行这样解决。