前言:本文基于若依前后端分离版本(Spring Boot 3.3.0 + Vue 3 + Activiti 8.1.0)进行改造,相关教程可以在网上找到。在撰写此博客期间,笔者刚刚开始接触 Java Web,本系列下的文章内容包含大量“个人初期”视角,注意鉴别。

为啥要配置多数据源?

业务、流程、系统相关数据库进行分离,免得一次性全炸了,当然商业软件可能会更多的考量,比如数据备份、读写分离等等安全性的考虑,目前的想法出于业务分离的考量,再同样的系统上集成其他业务,就不需要重新搞用户、部门等数据表。

怎么配?

若依项目本身就集成了多数据源的配置,在alllication.yml中就有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
spring:
datasource:
druid:
# 主库数据源
master:
url: jdbc:mysql://localhost:3306/sys_iams?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
username: root
password: qwertyuiop
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: true
url: jdbc:mysql://localhost:3306/archive_iams?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
username: root
password: asdfghjkl
# 流程设计器相关
activiti:
url: jdbc:mysql://localhost:3306/activiti8_iams?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
username: root
password: zxcvbnm,./

在DruidConfig类中我们可以看到创建数据源的流程,若依本身写好了动态数据源,当然,若依官方并没有提供activiti数据库的连接,照猫画虎再写一个就行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@Bean
@ConfigurationProperties("spring.datasource.druid.master")
public DataSource masterDataSource(DruidProperties druidProperties)
{
DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
return druidProperties.dataSource(dataSource);
}

@Bean
@ConfigurationProperties("spring.datasource.druid.slave")
@ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
public DataSource slaveDataSource(DruidProperties druidProperties)
{
DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
return druidProperties.dataSource(dataSource);
}

@Bean(name = "dynamicDataSource")
@Primary
public DynamicDataSource dataSource(DataSource masterDataSource)
{
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
return new DynamicDataSource(masterDataSource, targetDataSources);
}

@Bean(name = "activitiDataSource")
@ConfigurationProperties("spring.datasource.druid.activiti")
public DataSource activitiDataSource(DruidProperties druidProperties)
{
DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
return druidProperties.dataSource(dataSource);
}

在mapper与实体类的定义上可以正常按照原有步骤进行,唯一的区别就是需要手动声明它具体使用的数据源

1
2
3
4
5
6
@Mapper
@DataSource(value = DataSourceType.SLAVE)
public interface ArchiveMapper
{
// ……
}

做业务分类,sys与archive到此就可以了,每次指定从数据库中的表的时候,加个注解,注解默认是主数据库。

activiti是个例外

虽然在yml中我们配置了多个数据库,在自己的类与mapper可以随便指定了,但是activiti是要自己的建表的,总得给它指明具体是哪一个数据库,当然如果只有一个数据库,那就不用考虑那么多了,现在需要配置一下了,我们在durid中已经定义好了activiti数据源,是一个Bean,把这个Bean派发给配置类就行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

@Configuration
public class ActivitiConfig {

@Bean
public UserGroupManager userGroupManager(SpringSecurityGroupManager springSecurityGroupManager) {
return springSecurityGroupManager;
}

@Bean
public SpringProcessEngineConfiguration processEngineConfiguration(@Qualifier("activitiDataSource") DataSource activitiDataSource,PlatformTransactionManager transactionManager){
SpringProcessEngineConfiguration config = new SpringProcessEngineConfiguration();
config.setTransactionManager(transactionManager);
config.setDataSource(activitiDataSource);
config.setDatabaseSchemaUpdate("true");
return config;
}

@Bean(name = "activitiPlatformTransaction")
public PlatformTransactionManager transactionManager(@Qualifier("activitiDataSource") DataSource activitiDataSource){
return new DataSourceTransactionManager(activitiDataSource);
}
}

我也不知道为什么写这个BeanactivitiPlatformTransaction,但是不写他就报错。我想应该是关于管理数据库事务的一个Bean。