前言:本文基于若依前后端分离版本(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。