深入理解dynamic-datasource数据源分组:GroupDataSource完整使用指南 [特殊字符]

张开发
2026/4/18 7:30:43 15 分钟阅读

分享文章

深入理解dynamic-datasource数据源分组:GroupDataSource完整使用指南 [特殊字符]
深入理解dynamic-datasource数据源分组GroupDataSource完整使用指南 【免费下载链接】dynamic-datasourcedynamic datasource for springboot 多数据源 动态数据源 主从分离 读写分离 分布式事务项目地址: https://gitcode.com/gh_mirrors/dy/dynamic-datasourcedynamic-datasource-spring-boot-starter 是一款强大的 Spring Boot 多数据源动态切换框架其中数据源分组功能是其核心特性之一。本文将深入解析 GroupDataSource 的实现原理与使用技巧帮助你快速掌握动态数据源分组的最佳实践。什么是数据源分组 数据源分组是 dynamic-datasource 框架的核心概念它允许你将多个数据源逻辑上组织成一个组。当应用程序请求使用某个组时框架会根据配置的策略如轮询、随机等自动从组内选择一个数据源进行连接。核心优势读写分离将主库和从库分别放入不同的组负载均衡在多个从库之间自动分配查询请求高可用当一个数据源故障时自动切换到组内其他可用数据源灵活配置支持一主多从、多主多从、混合模式等多种场景GroupDataSource 核心源码解析 让我们先来看看 GroupDataSource 的核心实现// 源码位置dynamic-datasource-spring/src/main/java/com/baomidou/dynamic/datasource/ds/GroupDataSource.java Data public class GroupDataSource { private String groupName; // 组名 private DynamicDataSourceStrategy dynamicDataSourceStrategy; // 数据源选择策略 private MapString, DataSource dataSourceMap new ConcurrentHashMap(); // 组内数据源映射 public String determineDsKey() { return dynamicDataSourceStrategy.determineKey(new ArrayList(dataSourceMap.keySet())); } public DataSource determineDataSource() { return dataSourceMap.get(determineDsKey()); } }从源码可以看出GroupDataSource 主要包含三个核心属性groupName组的唯一标识dynamicDataSourceStrategy数据源选择策略dataSourceMap存储组内所有数据源的映射关系快速配置数据源分组 ️基础配置示例在 application.yml 中配置数据源分组非常简单spring: datasource: dynamic: datasource: master: # 默认数据源 url: jdbc:mysql://localhost:3306/master_db username: root password: 123456 slave_1: # 从库1属于slave组 url: jdbc:mysql://localhost:3307/slave_db1 username: root password: 123456 slave_2: # 从库2属于slave组 url: jdbc:mysql://localhost:3308/slave_db2 username: root password: 123456分组命名规则框架采用下划线_分割的命名约定数据源名称格式组名_序号slave_1和slave_2自动归入slave组切换数据源时可以使用组名slave或具体数据源名slave_1四种典型分组场景 1. 读写分离一主多从spring: datasource: dynamic: datasource: master: # 主库用于写操作 url: jdbc:mysql://master:3306/db slave_1: # 从库1用于读操作 url: jdbc:mysql://slave1:3306/db slave_2: # 从库2用于读操作 url: jdbc:mysql://slave2:3306/db2. 多主多从架构spring: datasource: dynamic: datasource: master_1: # 主库1 master_2: # 主库2 slave_1: # 从库1 slave_2: # 从库2 slave_3: # 从库33. 纯粹多库模式spring: datasource: dynamic: datasource: mysql: # MySQL数据库 oracle: # Oracle数据库 sqlserver: # SQL Server数据库 postgresql: # PostgreSQL数据库4. 混合配置模式spring: datasource: dynamic: datasource: master: # 默认主库 slave_1: # 从库1 slave_2: # 从库2 oracle_1: # Oracle数据库1 oracle_2: # Oracle数据库2使用 DS 注解切换数据源 ✨类级别注解Service DS(slave) // 整个类使用slave组 public class UserServiceImpl implements UserService { Autowired private JdbcTemplate jdbcTemplate; public ListUser findAll() { // 自动从slave组中选择一个数据源 return jdbcTemplate.query(SELECT * FROM users, userRowMapper); } }方法级别注解Service public class OrderServiceImpl implements OrderService { DS(master) // 写操作使用master public void createOrder(Order order) { // 使用master数据源执行插入操作 jdbcTemplate.update(INSERT INTO orders ...); } DS(slave) // 读操作使用slave组 public Order getOrderById(Long id) { // 从slave组中选择一个数据源执行查询 return jdbcTemplate.queryForObject(SELECT * FROM orders WHERE id ?, orderRowMapper, id); } }负载均衡策略配置 ⚖️dynamic-datasource 内置了多种负载均衡策略1. 轮询策略默认spring: datasource: dynamic: strategy: load-balance # 轮询策略2. 随机策略spring: datasource: dynamic: strategy: random # 随机选择3. 自定义策略你可以实现DynamicDataSourceStrategy接口来自定义选择逻辑Component public class CustomDataSourceStrategy implements DynamicDataSourceStrategy { Override public String determineKey(ListString dataSourceKeys) { // 自定义选择逻辑 return dataSourceKeys.get(0); // 总是选择第一个 } }动态添加和移除数据源 运行时添加数据源Autowired private DynamicRoutingDataSource dynamicRoutingDataSource; public void addDynamicDataSource() { DataSourceProperty property new DataSourceProperty(); property.setUrl(jdbc:mysql://new-slave:3306/db); property.setUsername(root); property.setPassword(123456); // 动态添加到slave组 dynamicRoutingDataSource.addDataSource(slave_3, dataSourceCreator.createDataSource(property)); }运行时移除数据源public void removeDynamicDataSource() { // 从slave组中移除slave_3 dynamicRoutingDataSource.removeDataSource(slave_3); }嵌套数据源切换 dynamic-datasource 支持多层嵌套的数据源切换Service public class ComplexService { DS(master) public void masterOperation() { // 在master数据源上执行操作 slaveOperation(); // 切换到slave组 } DS(slave) public void slaveOperation() { // 在slave组中选择一个数据源执行操作 anotherOperation(); // 切换到oracle数据源 } DS(oracle) public void anotherOperation() { // 在oracle数据源上执行操作 } }最佳实践与性能优化 1. 连接池配置优化spring: datasource: dynamic: datasource: master: url: jdbc:mysql://localhost:3306/db hikari: maximum-pool-size: 20 minimum-idle: 10 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 18000002. 监控与健康检查RestController public class DataSourceMonitorController { Autowired private DynamicRoutingDataSource routingDataSource; GetMapping(/datasources) public MapString, Object getDataSources() { MapString, Object result new HashMap(); result.put(primary, routingDataSource.getPrimary()); result.put(dataSourceMap, routingDataSource.getDataSources()); result.put(groupDataSources, routingDataSource.getGroupDataSources()); return result; } }3. 异常处理策略Configuration public class DataSourceConfig { Bean public DynamicDataSourceProperties dynamicDataSourceProperties() { DynamicDataSourceProperties properties new DynamicDataSourceProperties(); properties.setStrict(false); // 宽松模式未匹配到数据源时使用默认数据源 properties.setGraceDestroy(true); // 优雅关闭数据源 return properties; } }常见问题解答 ❓Q1如何查看当前所有数据源分组通过DynamicRoutingDataSource的getGroupDataSources()方法可以获取所有分组信息MapString, GroupDataSource groupDataSources dynamicRoutingDataSource.getGroupDataSources();Q2分组数据源如何选择具体的数据库框架会根据配置的DynamicDataSourceStrategy策略自动选择。默认使用轮询策略你也可以自定义选择逻辑。Q3支持哪些数据库连接池dynamic-datasource 支持DruidHikariCPBeeCPDBCP2C3P0AtomikosOracle UCPQ4如何实现分库分表虽然 dynamic-datasource 主要解决多数据源问题但可以与 ShardingSphere 等分库分表框架结合使用实现更复杂的数据分布策略。总结 GroupDataSource 是 dynamic-datasource 框架中实现数据源分组的核心组件。通过合理的数据源分组配置你可以轻松实现读写分离提升系统性能负载均衡分散查询压力高可用自动故障转移灵活扩展动态添加移除数据源掌握数据源分组的使用技巧能够让你的 Spring Boot 应用在数据库层面获得更好的可扩展性和可靠性。建议在实际项目中根据业务需求选择合适的配置模式并充分利用框架提供的监控和管理功能。官方文档与源码参考 GroupDataSource 源码dynamic-datasource-spring/src/main/java/com/baomidou/dynamic/datasource/ds/GroupDataSource.java动态路由数据源dynamic-datasource-spring/src/main/java/com/baomidou/dynamic/datasource/DynamicRoutingDataSource.java数据源策略接口dynamic-datasource-spring/src/main/java/com/baomidou/dynamic/datasource/strategy/DynamicDataSourceStrategy.java通过本文的学习相信你已经掌握了 dynamic-datasource 数据源分组的核心概念和使用方法。在实际开发中合理的数据源分组设计能够显著提升系统的性能和可靠性是构建高性能 Spring Boot 应用的重要技能 【免费下载链接】dynamic-datasourcedynamic datasource for springboot 多数据源 动态数据源 主从分离 读写分离 分布式事务项目地址: https://gitcode.com/gh_mirrors/dy/dynamic-datasource创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

更多文章