1. 多数据源配置背景与需求分析
在企业级应用开发中,多数据源配置是常见的架构需求。以若依(RuoYi)微服务框架为例,实际业务场景中往往需要同时连接多种数据库。比如既要保留原有MySQL数据库的兼容性,又要适配国产化的达梦DM数据库。这种混合架构既能保证历史业务平稳运行,又能满足国产化替代的合规要求。
我最近在金融行业某项目中就遇到了这种典型场景:核心交易系统要求使用达梦DM8数据库,而外围管理系统仍保持MySQL5.7。通过若依微服务实现双数据源配置后,不仅满足了监管要求,还实现了新旧系统的无缝衔接。下面分享具体实现方案和踩坑经验。
2. 环境准备与依赖配置
2.1 基础环境要求
- JDK 1.8+(推荐OpenJDK 11)
- Spring Boot 2.5.x(与若依微服务版兼容)
- MySQL 5.7+(实测8.0存在部分语法兼容问题)
- 达梦DM8(需获取官方JDBC驱动)
- Maven 3.6+
特别注意:达梦数据库的JDBC驱动需要从官网下载,不能通过Maven中央仓库获取。建议将dm-jdbc-driver.jar安装到本地仓库:
mvn install:install-file -Dfile=dm-jdbc-driver.jar -DgroupId=com.dameng -DartifactId=dm-jdbc-driver -Dversion=8.1.1.193 -Dpackaging=jar2.2 Maven依赖关键配置
在ruoyi-common模块的pom.xml中添加:
<!-- MySQL连接池 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <!-- 达梦数据库驱动 --> <dependency> <groupId>com.dameng</groupId> <artifactId>dm-jdbc-driver</artifactId> <version>8.1.1.193</version> </dependency> <!-- 多数据源支持 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.5.2</version> </dependency>3. 多数据源核心配置实现
3.1 配置文件设置
在application.yml中配置双数据源:
spring: datasource: dynamic: primary: master strict: false datasource: master: url: jdbc:mysql://127.0.0.1:3306/ry-cloud?useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver dm: url: jdbc:dm://192.168.1.100:5236/DAMENG?schema=RYCLOUD username: SYSDBA password: SYSDBA001 driver-class-name: dm.jdbc.driver.DmDriver关键参数说明:
primary指定默认数据源- 达梦的URL中需要指定schema(对应MySQL的database)
- 达梦默认端口5236,SYSDBA是默认超级用户
3.2 数据源切换实现
在Service层使用方法注解切换数据源:
@Service public class UserServiceImpl implements UserService { @DS("master") // 默认MySQL数据源 public List<User> selectMySQLUsers() { return userMapper.selectList(); } @DS("dm") // 切换到达梦数据源 public List<User> selectDMUsers() { return userMapper.selectList(); } }4. 兼容性处理与实战技巧
4.1 SQL语法差异处理
达梦与MySQL存在语法差异,常见问题处理:
- 分页查询:
-- MySQL SELECT * FROM user LIMIT 10,20 -- 达梦等效写法 SELECT * FROM user OFFSET 10 ROWS FETCH NEXT 20 ROWS ONLY- 日期函数:
-- MySQL DATE_FORMAT(create_time, '%Y-%m-%d') -- 达梦 TO_CHAR(create_time, 'YYYY-MM-DD')解决方案:在XML映射文件中使用条件判断:
<select id="selectUserList"> SELECT * FROM user <where> <if test="dbType == 'mysql'"> AND DATE_FORMAT(create_time, '%Y-%m-%d') = #{date} </if> <if test="dbType == 'dm'"> AND TO_CHAR(create_time, 'YYYY-MM-DD') = #{date} </if> </where> </select>4.2 事务管理要点
多数据源环境下事务管理的特殊要求:
- 避免跨数据源事务:
// 错误示例!会导致事务失效 @Transactional public void transfer() { @DS("master") deductMySQL(); // MySQL操作 @DS("dm") addDM(); // 达梦操作 }- 正确做法是拆分服务:
@Service public class AccountService { @DS("master") @Transactional public void deductMySQL() {...} @DS("dm") @Transactional public void addDM() {...} } // 在Controller层调用 accountService.deductMySQL(); accountService.addDM();5. 性能优化实践
5.1 连接池配置建议
在application.yml中优化连接池:
spring: datasource: dynamic: datasource: master: hikari: maximum-pool-size: 20 minimum-idle: 5 connection-timeout: 30000 dm: hikari: maximum-pool-size: 15 minimum-idle: 3 connection-timeout: 60000 # 达梦连接较慢可适当延长5.2 监控配置
集成Druid监控多数据源状态:
- 添加依赖:
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.11</version> </dependency>- 配置监控页:
@Configuration public class DruidConfig { @Bean public ServletRegistrationBean<StatViewServlet> druidServlet() { ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>( new StatViewServlet(), "/druid/*"); bean.addInitParameter("loginUsername", "admin"); bean.addInitParameter("loginPassword", "123456"); return bean; } }6. 常见问题排查
6.1 连接失败问题
症状:达梦数据库连接超时
排查步骤:
- 检查防火墙是否开放5236端口
- 验证达梦服务是否启动:
systemctl status DmService - 检查连接字符串中的IP和端口
- 确认SYSDBA账户密码是否正确
解决方案:
# 达梦控制台工具验证连接 ./disql SYSDBA/SYSDBA001@192.168.1.100:52366.2 字符集问题
症状:中文显示乱码
解决方法:
- 达梦服务端配置:
ALTER SYSTEM SET 'UNICODE_FLAG'=1 SCOPE=SPFILE; ALTER SYSTEM SET 'LENGTH_IN_CHAR'=1 SCOPE=SPFILE;- JDBC连接字符串添加参数:
jdbc:dm://host:port/DAMENG?charset=GBK6.3 主键自增差异
MySQL与达梦的自增机制不同:
MySQL方案:
CREATE TABLE user ( id BIGINT AUTO_INCREMENT PRIMARY KEY );达梦适配方案:
CREATE TABLE user ( id BIGINT IDENTITY(1,1) PRIMARY KEY ); -- 或者使用序列 CREATE SEQUENCE user_seq; CREATE TABLE user ( id BIGINT DEFAULT user_seq.NEXTVAL PRIMARY KEY );7. 生产环境部署建议
连接池监控:建议配置Prometheus监控各数据源连接池状态,设置以下关键指标告警:
- 活跃连接数 > 最大连接数的80%
- 等待获取连接的线程数 > 0
- 连接获取时间 > 1s
慢SQL处理:达梦数据库开启慢查询日志:
-- 设置慢查询阈值(秒) SP_SET_PARA_VALUE(1, 'SQL_TRACE_SLOW_TIME', 1); -- 开启慢查询日志 SP_SET_PARA_VALUE(1, 'SQL_TRACE_MASK', 15);- 备份策略差异:
- MySQL:使用xtrabackup定时全量+binlog增量
- 达梦:使用DMRMAN工具执行在线备份
./dmrman CTLSTMT="BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/backup/full_bak'"- 故障转移方案:
- MySQL配置MGR集群
- 达梦配置DSC集群(共享存储集群)
我在实际部署中发现达梦DSC对共享存储性能要求较高,建议采用高性能SAN存储,同时配置多路径访问避免单点故障。测试环境下可以使用iSCSI模拟,但生产环境务必使用FC-SAN。