若依3.6.0项目实战:手把手教你配置MySQL主库+Oracle从库(附完整yml配置)

张开发
2026/4/8 2:15:42 15 分钟阅读

分享文章

若依3.6.0项目实战:手把手教你配置MySQL主库+Oracle从库(附完整yml配置)
若依3.6.0异构数据库实战MySQL主库与Oracle从库的高效配置指南在传统企业级应用开发中经常会遇到需要同时操作多种数据库系统的场景。特别是当企业从老旧系统向现代化架构迁移时Oracle到MySQL的过渡期往往需要两者并存。若依(RuoYi)作为国内流行的快速开发框架其3.6.0版本提供了灵活的多数据源支持能够完美应对这种异构数据库主从配置的需求。1. 环境准备与依赖管理异构数据库配置的首要挑战是解决不同数据库驱动之间的兼容性问题。以MySQL 8.0作为主库、Oracle 19c作为从库的典型组合为例我们需要特别注意驱动版本的匹配。基础依赖配置!-- MySQL驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.28/version /dependency !-- Oracle驱动 -- dependency groupIdcom.oracle.database.jdbc/groupId artifactIdojdbc8/artifactId version19.3.0.0/version /dependency注意Oracle官方ojdbc8驱动从12.2.0.1版本开始支持JDBC 4.2规范建议使用19c及以上版本以获得最佳兼容性。对于使用若依3.6.0的项目还需要确保以下核心依赖的版本兼容依赖项推荐版本作用说明druid-spring-boot-starter1.2.8数据库连接池管理mybatis-spring-boot-starter2.2.2MyBatis集成支持dynamic-datasource-spring-boot-starter3.5.1多数据源动态切换2. 多数据源配置详解若依框架基于Spring Boot的自动配置特性通过application-druid.yml文件管理数据源配置。对于MySQLOracle的异构组合需要特别注意两者的参数差异。完整的yml配置示例# 主数据源配置 (MySQL) master: url: jdbc:mysql://localhost:3306/ry?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLtrueserverTimezoneGMT%2B8 username: root password: your_mysql_password driver-class-name: com.mysql.cj.jdbc.Driver # 从数据源配置 (Oracle) slave: url: jdbc:oracle:thin://localhost:1521/ORCLCDB username: system password: your_oracle_password driver-class-name: oracle.jdbc.OracleDriver validation-query: SELECT 1 FROM DUAL # 连接池通用配置 initialSize: 5 minIdle: 5 maxActive: 20 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 filters: stat,wall,slf4j connectionProperties: druid.stat.mergeSqltrue;druid.stat.slowSqlMillis5000关键配置差异说明URL格式Oracle使用jdbc:oracle:thin://host:port/SID格式而MySQL是jdbc:mysql://host:port/database驱动类名Oracle为oracle.jdbc.OracleDriverMySQL为com.mysql.cj.jdbc.Driver验证查询Oracle通常使用SELECT 1 FROM DUALMySQL则可以直接用SELECT 13. 动态数据源切换实战若依框架通过DataSource注解实现优雅的数据源切换这对于异构数据库操作尤为重要。以下是几种典型的使用场景1. 类级别注解Service DataSource(value DataSourceType.SLAVE) public class OracleDataServiceImpl implements DataService { // 该类所有方法默认使用Oracle从库 }2. 方法级别注解Repository public interface UserMapper { DataSource(DataSourceType.MASTER) ListUser selectUserList(User user); DataSource(DataSourceType.SLAVE) User selectUserById(Long userId); }3. 事务中的特殊处理Transactional public void transferData() { // 默认使用主数据源 mysqlData masterMapper.selectData(); // 需要显式切换数据源 DataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE); try { oracleMapper.insertData(mysqlData); } finally { DataSourceContextHolder.clearDataSourceType(); } }重要提示在事务方法中切换数据源需要特别注意不同数据库的事务管理器无法协同工作跨库事务需要通过分布式事务解决方案处理。4. 性能优化与常见问题排查异构数据库配置往往会遇到一些特有的性能瓶颈和兼容性问题以下是一些实战经验总结连接池优化参数对比参数MySQL推荐值Oracle推荐值说明initialSize53初始连接数maxActive2015最大活跃连接数maxWait6000030000获取连接超时时间(ms)validationQuerySELECT 1SELECT 1 FROM DUAL连接验证SQL常见问题解决方案时区问题MySQL配置中建议明确指定时区serverTimezoneGMT%2B8Oracle默认使用数据库服务器时区可通过ALTER SESSION SET TIME_ZONE8:00调整字符集问题MySQL连接URL中建议添加useUnicodetruecharacterEncodingutf8Oracle字符集在数据库创建时确定应用层需保持一致方言差异Configuration public class MyBatisConfig { Bean public DatabaseIdProvider databaseIdProvider() { DatabaseIdProvider databaseIdProvider new VendorDatabaseIdProvider(); Properties properties new Properties(); properties.setProperty(Oracle, oracle); properties.setProperty(MySQL, mysql); databaseIdProvider.setProperties(properties); return databaseIdProvider; } }SQL兼容性分页查询MySQL使用LIMITOracle使用ROWNUM自增IDMySQL有AUTO_INCREMENTOracle需要序列触发器实现性能监控建议# 开启Druid监控 stat-view-servlet: enabled: true url-pattern: /druid/* login-username: admin login-password: admin reset-enable: false5. 高级应用场景对于更复杂的业务需求若依的多数据源功能还可以进一步扩展1. 多从库负载均衡public enum DataSourceType { MASTER, SLAVE1, SLAVE2 } // 使用随机策略选择从库 DataSource public DataSourceType determineCurrentLookupKey() { return random.nextBoolean() ? DataSourceType.SLAVE1 : DataSourceType.SLAVE2; }2. 读写分离自动路由Aspect Component public class DataSourceAspect { Before(execution(* com.ruoyi..*.mapper..*.select*(..)) || execution(* com.ruoyi..*.mapper..*.get*(..)) || execution(* com.ruoyi..*.mapper..*.find*(..))) public void setReadDataSourceType() { DataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE); } Before(execution(* com.ruoyi..*.mapper..*.insert*(..)) || execution(* com.ruoyi..*.mapper..*.update*(..)) || execution(* com.ruoyi..*.mapper..*.delete*(..))) public void setWriteDataSourceType() { DataSourceContextHolder.setDataSourceType(DataSourceType.MASTER); } }3. 多租户数据隔离public class TenantDataSourceSelector { public static String determineCurrentLookupKey() { String tenantId TenantContext.getCurrentTenant(); return tenant_ tenantId; } } // 在配置类中动态注册数据源 Bean ConditionalOnMissingBean public DataSource dataSource() { MapObject, Object targetDataSources new HashMap(); tenants.forEach(tenant - { targetDataSources.put( tenant_ tenant.getId(), createDataSource(tenant.getDbConfig()) ); }); DynamicDataSource dynamicDataSource new DynamicDataSource(); dynamicDataSource.setTargetDataSources(targetDataSources); return dynamicDataSource; }在实际项目中我们曾遇到一个Oracle从库响应缓慢的问题最终发现是由于NLS_SORT参数设置为BINARY_CI导致的索引失效。通过调整会话参数或直接修改数据库参数后查询性能提升了10倍以上。这种异构数据库环境下的性能调优经验往往需要在实战中不断积累。

更多文章