当前位置: 首页 > news >正文

SpringBoot-DynamicDataSource配置详解:主从数据源配置与轮询策略

SpringBoot-DynamicDataSource配置详解:主从数据源配置与轮询策略

【免费下载链接】SpringBoot-DynamicDataSourceDynamic datasource, multiple datasource of spring boot/ distribution transaction; spring boot 多数据源,动态数据源,分布式事务项目地址: https://gitcode.com/gh_mirrors/sp/SpringBoot-DynamicDataSource

SpringBoot-DynamicDataSource是一个强大的Spring Boot多数据源解决方案,它支持动态数据源切换和主从数据源配置,能够帮助开发者轻松实现分布式系统中的数据访问层设计。本文将详细介绍如何配置主从数据源以及实现从库轮询策略,让你的项目具备高可用的数据访问能力。

为什么需要主从数据源配置?

在现代应用架构中,数据库往往成为性能瓶颈。通过主从分离架构,我们可以将写操作集中在主库,读操作分散到多个从库,从而提高系统的并发处理能力和数据可用性。SpringBoot-DynamicDataSource提供了简单易用的主从数据源配置方式,让开发者无需复杂编码即可实现这一架构。

快速开始:环境准备

要使用SpringBoot-DynamicDataSource,首先需要克隆项目仓库:

git clone https://gitcode.com/gh_mirrors/sp/SpringBoot-DynamicDataSource

项目采用Gradle构建,核心依赖包括Spring Boot和HikariCP连接池。确保你的开发环境中已安装JDK 8+和MySQL数据库。

主从数据源配置步骤

1. 配置文件设置

主从数据源的配置主要在src/main/resources/application.properties文件中完成。该文件中定义了主库和多个从库的连接信息:

# 主数据源配置 spring.datasource.hikari.master.name=master spring.datasource.hikari.master.driver-class-name=com.mysql.jdbc.Driver spring.datasource.hikari.master.jdbc-url=jdbc:mysql://localhost/product_master?useSSL=false spring.datasource.hikari.master.port=3306 spring.datasource.hikari.master.username=root spring.datasource.hikari.master.password=123456 # 从数据源配置 - SlaveAlpha spring.datasource.hikari.slave-alpha.name=SlaveAlpha spring.datasource.hikari.slave-alpha.jdbc-url=jdbc:mysql://localhost/product_slave_alpha?useSSL=false # 从数据源配置 - SlaveBeta spring.datasource.hikari.slave-beta.name=SlaveBeta spring.datasource.hikari.slave-beta.jdbc-url=jdbc:mysql://localhost/product_slave_beta?useSSL=false # 从数据源配置 - SlaveGamma spring.datasource.hikari.slave-gamma.name=SlaveGamma spring.datasource.hikari.slave-gamma.jdbc-url=jdbc:mysql://localhost/product_slave_gamma?useSSL=false

配置文件中使用了HikariCP连接池,通过不同的前缀区分主库和各个从库。你需要根据实际环境修改数据库URL、用户名和密码。

2. 数据源配置类

项目中的src/main/java/cn/com/hellowood/dynamicdatasource/configuration/DataSourceConfigurer.java类负责数据源的配置和初始化。该类通过@ConfigurationProperties注解将配置文件中的属性绑定到数据源对象,并设置主数据源为默认数据源:

@ConfigurationProperties(prefix = "spring.datasource.hikari.master") public DataSource masterDataSource() { return new HikariDataSource(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.hikari.slave-alpha") public DataSource slaveAlphaDataSource() { return new HikariDataSource(); } // 其他从数据源配置...

3. 动态数据源路由

DynamicRoutingDataSource类继承自Spring的AbstractRoutingDataSource,负责根据上下文动态选择数据源。它通过determineCurrentLookupKey方法获取当前线程的数据源键,从而实现数据源的动态切换。

从库轮询策略实现

SpringBoot-DynamicDataSource采用轮询策略来分发从库的读请求,实现负载均衡。这一策略在DynamicDataSourceContextHolder类中实现:

public static void useSlaveDataSource() { try { int datasourceKeyIndex = counter % slaveDataSourceKeys.size(); CONTEXT_HOLDER.set(String.valueOf(slaveDataSourceKeys.get(datasourceKeyIndex))); counter++; } catch (Exception e) { logger.error("Switch slave datasource failed, error message is {}", e.getMessage()); useMasterDataSource(); e.printStackTrace(); } }

上述代码通过计数器和取模运算实现了从库的轮询选择。当切换从库失败时,系统会自动切换到主库,保证系统的可用性。

数据源切换的使用方式

1. 注解方式

项目提供了AOP切面DynamicDataSourceAspect,通过拦截Mapper接口的方法调用,自动切换数据源。默认情况下,写操作使用主库,读操作使用从库:

@Pointcut("execution( * cn.com.hellowood.dynamicdatasource.mapper.*.*(..))") public void dataSourcePointCut() {} @Around("dataSourcePointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { // 根据方法名判断是读操作还是写操作,选择相应的数据源 // ... }

2. 手动切换

你也可以在代码中手动切换数据源:

// 使用主库 DynamicDataSourceContextHolder.useMasterDataSource(); // 使用从库(轮询选择) DynamicDataSourceContextHolder.useSlaveDataSource(); // 手动指定数据源 DynamicDataSourceContextHolder.setDataSourceKey("SlaveAlpha");

常见问题解决

1. 数据源切换不生效

如果遇到数据源切换不生效的问题,首先检查DataSourceConfigurer类中是否正确配置了SqlSessionFactory

sqlSessionFactoryBean.setDataSource(dynamicDataSource());

确保将动态数据源设置到SqlSessionFactory中,这是实现数据源切换的关键步骤。

2. 从库轮询不均匀

如果发现从库负载不均衡,可以检查DynamicDataSourceContextHolder类中的计数器实现,确保其线程安全性。项目中使用的counter变量是静态的,可能会导致并发环境下的计数不准确,可以考虑使用原子类来优化。

总结

SpringBoot-DynamicDataSource提供了一种简单高效的方式来实现Spring Boot应用的多数据源配置和动态切换。通过本文介绍的主从数据源配置和轮询策略,你可以轻松构建高可用、高性能的数据访问层。项目的核心代码位于src/main/java/cn/com/hellowood/dynamicdatasource/configuration/目录下,包括数据源配置、动态路由和切换策略等关键实现。

无论是小型项目还是大型分布式系统,SpringBoot-DynamicDataSource都能满足你的多数据源需求,帮助你构建更健壮的应用系统。赶快尝试使用吧!

【免费下载链接】SpringBoot-DynamicDataSourceDynamic datasource, multiple datasource of spring boot/ distribution transaction; spring boot 多数据源,动态数据源,分布式事务项目地址: https://gitcode.com/gh_mirrors/sp/SpringBoot-DynamicDataSource

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/1308927/

相关文章:

  • 上海黄金回收极速回款模式,门店标准化结算流程全程透明 - 日常比对手册
  • 长春芬尼门店推荐:【芬尼】长春授权 - 晚香时候
  • 水灰比-定义
  • 2026年7月市面上有实力的全自动贴标机直销厂家推荐,小型贴标机/全自动贴标机/圆瓶贴标机,全自动贴标机实力厂家推荐 - 品牌推荐师
  • 终极指南:如何用Boss Show Time插件让招聘信息时间一目了然
  • tiny11builder终极实战:高效构建精简Windows 11镜像的完整指南
  • Python 环境配置(二)安装jupyter、matplotlib、numpy库
  • 惠州广告标牌uv打印机/小型uv打印机厂家推荐|地址电话与到店核对指引|2026年8月1日资料更新 - GEO99
  • 终极指南:如何高效使用reMarkable文件系统探索工具rmtree和rMExplorer
  • Nessus【部署 01】Linux环境部署漏洞扫描工具Nessus最新版详细过程分享(下载+安装+注册+激活)
  • 英雄联盟Akari助手:基于LCU API的全能游戏工具箱,提升你的游戏体验
  • CS2-dumper完全指南:自动化获取游戏内存偏移与接口信息
  • 2026年8月房山高空车出租/升降平台配件更换服务点核对|北京华力恒通机械设备租赁电话、地址与到店准备|2026年8月1日资料更新 - GEO99
  • 长春空气能品牌哪家专业:【芬尼】寒地专精 - 晴光转树
  • SQL Server及SQL Server代理默认账户
  • 从0到1读懂GEO源头厂商:爱搜索GEO为何成为企业AI搜索优化的底层选择 - 品牌报告
  • ESP32-S3触摸屏开发实战:从硬件选型到GUI应用开发
  • Java转大模型:Demo能跑不算本事,能守住生产环境才算
  • USB转串口模块全解析:从芯片选型、隔离电路到工业应用避坑指南
  • 学术探讨 —— 《基于密集型复杂城市场景下求解无人机三维路径规划的Q-learning 算法研究附Matlab代码》
  • NapCatQQ快速上手指南:5分钟搭建现代化QQ机器人开发平台
  • 海淀车载登高车出租/工程高空设备维保服务网点|15611104615电话与地址核对|营业时间+到店准备|2026年8月1日资料更新 - GEO99
  • 长春空气能选购门店哪家专业:【芬尼】工况定制 - 秋山寄远
  • 2026年跨省寄大件怎么预约?避开这5个坑,行李搬家能省一半钱 - 快递物流资讯
  • 2026年8月佛山DTF白墨烫画机/UV小型打印机哪家好|地址整理与电话核对|到店前准备与营业时间确认|8月1日资料更新 - GEO99
  • 告别手动操作:用SeleniumBasic实现VBScript浏览器自动化终极指南
  • 石墨粉生产应用科普:3个核心方向的经验分享
  • BilibiliDown:5分钟上手!跨平台B站视频下载神器完整指南
  • 终极指南:如何使用JKSM 3DS存档管理器保护你的游戏进度
  • 2026年山东PP板厂家挑选指南:恒峻诚诚塑业等企业梳理及行业避坑要点汇总 - 八方八方