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

网站网站制作费用万户建站

网站网站制作费用,万户建站,如何把做的网站变成链接,少女论坛资源Spring Boot多数据源动态切换:AbstractRoutingDataSource实战 引言 在企业级应用开发中,随着业务规模的扩大,我们经常会遇到需要同时操作多个数据库的场景:可能是主从读写分离、多租户架构、分库分表需求,或是需要同…

Spring Boot多数据源动态切换:AbstractRoutingDataSource实战

引言

在企业级应用开发中,随着业务规模的扩大,我们经常会遇到需要同时操作多个数据库的场景:可能是主从读写分离、多租户架构、分库分表需求,或是需要同时连接业务库和日志库等特殊场景。传统的单数据源配置已无法满足这类需求,而Spring Boot提供的AbstractRoutingDataSource正是解决这类问题的利器。本文将深入探讨如何基于AbstractRoutingDataSource实现多数据源的动态切换,并通过实战代码演示具体实现方案。


一、核心原理剖析

1.1 AbstractRoutingDataSource工作机制

AbstractRoutingDataSource是Spring框架提供的一个抽象类,通过路由机制(Routing)实现数据源的动态切换。其核心逻辑是维护一个Map<Object, DataSource>结构,通过determineCurrentLookupKey()方法返回当前线程需要使用的数据源标识(lookup key),进而从目标数据源集合中获取对应的DataSource

1.2 线程级数据源管理

动态数据源切换的核心是线程隔离。每个请求线程通过ThreadLocal保存当前数据源标识,确保不同线程间的数据源选择互不干扰。这种设计完美适配Web应用的请求-响应模型,天然支持高并发场景。


二、实战:四步实现动态数据源

2.1 环境准备

pom.xml中添加基础依赖:

 

xml

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>

2.2 数据源配置

application.yml中配置主从数据源:

 

yaml

datasource:master:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/master_dbusername: rootpassword: master_pwdpool-name: MASTER_POOLslave:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/slave_dbusername: rootpassword: slave_pwdpool-name: SLAVE_POOL

2.3 动态数据源核心实现

2.3.1 数据源上下文持有器
 

java

public class DataSourceContextHolder {private static final ThreadLocal<String> CONTEXT = new ThreadLocal<>();public static void setDataSource(String name) {CONTEXT.set(name);}public static String getDataSource() {return CONTEXT.get();}public static void clear() {CONTEXT.remove();}
}
2.3.2 动态数据源实现类
 

java

public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceContextHolder.getDataSource();}@Bean@ConfigurationProperties(prefix = "datasource.master")public DataSource masterDataSource() {return DataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix = "datasource.slave")public DataSource slaveDataSource() {return DataSourceBuilder.create().build();}@Beanpublic DataSource dynamicDataSource() {Map<Object, Object> dataSources = new HashMap<>(2);dataSources.put("master", masterDataSource());dataSources.put("slave", slaveDataSource());DynamicDataSource ds = new DynamicDataSource();ds.setDefaultTargetDataSource(masterDataSource());ds.setTargetDataSources(dataSources);return ds;}
}

2.4 切换切面实现

 

java

@Aspect
@Component
public class DataSourceAspect {@Before("@annotation(com.example.annotation.Master)")public void switchMaster() {DataSourceContextHolder.setDataSource("master");}@Before("@annotation(com.example.annotation.Slave)")public void switchSlave() {DataSourceContextHolder.setDataSource("slave");}@AfterReturning("@annotation(com.example.annotation.Master) || @annotation(com.example.annotation.Slave)")public void clearDataSource() {DataSourceContextHolder.clear();}
}

三、进阶功能扩展

3.1 动态数据源注册

 

java

public void addNewDataSource(String key, DataSource dataSource) {Map<Object, Object> targetDataSources = new HashMap<>(dynamicDataSource.getTargetDataSources());targetDataSources.put(key, dataSource);dynamicDataSource.setTargetDataSources(targetDataSources);dynamicDataSource.afterPropertiesSet();
}

3.2 事务管理增强

 

java

@Bean
public PlatformTransactionManager transactionManager() {return new DataSourceTransactionManager(dynamicDataSource());
}

四、测试验证

 

java

@SpringBootTest
class DynamicDSTest {@Autowiredprivate JdbcTemplate jdbcTemplate;@Test@Mastervoid testMasterWrite() {jdbcTemplate.execute("INSERT INTO user(name) VALUES('test')");}@Test@Slavevoid testSlaveRead() {List<Map<String, Object>> result = jdbcTemplate.queryForList("SELECT * FROM user");System.out.println(result);}
}

五、注意事项与优化建议

  1. 连接池监控:建议集成Druid的监控功能,实时观察各数据源状态
  2. 失败回退机制:当目标数据源不可用时,自动切换到默认数据源
  3. 性能调优:根据实际场景调整各连接池参数(maxPoolSize、minIdle等)
  4. 分布式事务:对于跨数据源事务,建议使用Seata等分布式事务解决方案
  5. 动态刷新:结合Nacos配置中心实现数据源配置的热更新

总结

通过AbstractRoutingDataSource实现多数据源动态切换,我们既保持了Spring Boot简洁的配置风格,又获得了灵活的数据源管理能力。这种方案在中小型项目中表现优异,但对于需要复杂分片策略的大型分布式系统,建议考虑集成ShardingSphere等专业中间件。希望本文能为您在应对复杂数据源场景时提供有价值的参考。


文章转载自:

http://9AWPyfaB.fqymm.cn
http://jfvP5Cmn.fqymm.cn
http://UOvINlIZ.fqymm.cn
http://oIoM5I57.fqymm.cn
http://wKO8s1M8.fqymm.cn
http://u7OOnNgM.fqymm.cn
http://xqEvzBmw.fqymm.cn
http://ABTQTYOi.fqymm.cn
http://K0pxq6ut.fqymm.cn
http://UHe8v5lZ.fqymm.cn
http://qiXfvq5D.fqymm.cn
http://Mwk9MBgP.fqymm.cn
http://xDRzkTGn.fqymm.cn
http://VdjjHpCp.fqymm.cn
http://NSEC8VE3.fqymm.cn
http://7KzUYwfH.fqymm.cn
http://KY7rpQM9.fqymm.cn
http://2whK554a.fqymm.cn
http://oWl6Yiyr.fqymm.cn
http://QHjQDIfP.fqymm.cn
http://zygfoZSU.fqymm.cn
http://qPGZDkBf.fqymm.cn
http://XJ2EyuH0.fqymm.cn
http://8bC9sDsP.fqymm.cn
http://XFszUdn6.fqymm.cn
http://FM2MCdYU.fqymm.cn
http://jZ00ra6f.fqymm.cn
http://ZOMuhc03.fqymm.cn
http://WKO28usp.fqymm.cn
http://qTY1mI1H.fqymm.cn
http://www.dtcms.com/wzjs/668779.html

相关文章:

  • 瑞安市建设工程质量监督站网站小目标网站建设
  • 做php网站需要什么软件怎样在百度上发布广告
  • 怎么做电影网站教程怎么增加网站关键词库
  • 网站开发客户的思路总结自己可以做电子商务网站
  • 篇高端网站愿建设wordpress账户被禁用
  • 如果做网站运营建个企业网站收费
  • 自己做的影视网站买会员违法吗iis网站wordpress登陆
  • 做网站先建立模型质量好网站建设加工
  • 中国摄影网站有哪些群晖wordpress设置
  • 网站图怎么做会高清保险购买网站
  • 桂林生活网官方网站网站建设相关视频
  • 翻译网站建设网页设计期末作品代码
  • 广州营销型网站做音乐网站的选题背景
  • 如何做网站二级域名网站开发及维护合同
  • 懂的建设网站东营建设信息网官网首页
  • 广州 网站建设 行价整合营销公司排名
  • 招聘网站开发人员上饶市住房和城乡建设网站
  • 手机域名注册网站ftp备份网站
  • 梧州网站建设公司网站广告策划
  • 昆明网站营销东莞网站建设 兼职
  • iis如何添加网站网站建设公司推广方式
  • 学校网站建设意义有哪些网络品牌营销案例
  • 360线上推广google搜索优化
  • 毕业设计做系统好还是网站好做网站包含微信公众号吗
  • 高端的电影网站镇江网站
  • oou淘宝客图片wordpress模板青岛百度快速优化排名
  • 如何做网站的内链优化广州seo服务外包
  • 网站制作蒙特wordpress仪表盘加速
  • 网站公司查询域名价格查询网站
  • 钱包网站开发在线设计平台leopoly