利用AbstractRoutingDataSource实现动态数据源切换 (Spring+Hibernate)

springboot之AbstractRoutingDataSource抽象类实现动态多数据源切换原理解析 之前写过两篇实现动态多数据源的文章: 第一种:半自动化模式https://blog.youkuaiyun.com/yaomingyang/article/details/100807675 第二种:完全自动化配置模式:https://blog.youkuaiyun.com/yaomingyang/article/details/117089979 但是一直未对其实现的核心抽象类AbstractRoutingDataSource进行讲解,今天我们就来看下这个抽象类的源码实现原理;先看下部分源码: /** * Abstract {@ 阅读详情

转载之:http://exceptioneye.iteye.com/blog/1698064


Spring配置多数据源的方式和具体使用过程


1、数据源的名称常量类

    public enum DynamicDataSourceGlobal {

Java代码   收藏代码
  1.     ORCL,   
  2.     ISC  
  3. }  
 

2、建立一个获得和设置上下文环境的类,主要负责改变上下文数据源的名称

    public class DynamicDataSourceHolder {

Java代码   收藏代码
  1. // 线程本地环境  
  2. private static final ThreadLocal<DynamicDataSourceGlobal> contextHolder = new ThreadLocal<DynamicDataSourceGlobal>();  
  3.   
  4. // 设置数据源类型  
  5. public static void setDataSourceType(DynamicDataSourceGlobal dataSourceType) {  
  6.     Assert.notNull(dataSourceType, "DataSourceType cannot be null");  
  7.     contextHolder.set(dataSourceType);  
  8. }  
  9.   
  10. // 获取数据源类型  
  11. public static DynamicDataSourceGlobal getDataSourceType() {  
  12.     return (DynamicDataSourceGlobal) contextHolder.get();  
  13. }  
  14.   
  15. // 清除数据源类型  
  16. public static void clearDataSourceType() {  
  17.     contextHolder.remove();  
  18. }  
 

3、建立动态数据源类,注意,这个类必须继承AbstractRoutingDataSource,且实现方法 determineCurrentLookupKey,该方法返回一个Object,一般是返回字符串

    public class DynamicDataSource extends AbstractRoutingDataSource {

Java代码   收藏代码
  1.     @Override  
  2.     protected Object determineCurrentLookupKey() {  
  3.         return DynamicDataSourceHolder.getDataSourceType();  
  4.     }  
  5.   
  6. }  

4、编写spring的配置文件配置多个数据源

     <!-- 数据源相同的内容 -->

Java代码   收藏代码
  1.     <bean id="parentDataSource"  
  2.         class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  3.         <property name="driverClass"  
  4.             value="oracle.jdbc.pool.OracleConnectionPoolDataSource" />  
  5.         <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />  
  6.         <property name="user" value="isc_v10" />  
  7.         <property name="password" value="isc" />  
  8.     </bean>  
  9.   
  10.     <!-- 数据源 -->  
  11.     <bean id="orclDataSource" parent="parentDataSource">  
  12.         <property name="user" value="orcl" />  
  13.         <property name="password" value="orcl" />  
  14.     </bean>  
  15.   
  16.     <!-- 数据源 -->  
  17.     <bean id="iscDataSource" parent="parentDataSource">  
  18.         <property name="user" value="isc_v10" />  
  19.         <property name="password" value="isc" />  
  20.     </bean>  
  21.   
  22.     <!-- 编写spring 配置文件的配置多数源映射关系 -->  
  23.     <bean id="dataSource" class="com.wy.config.DynamicDataSource">  
  24.         <property name="targetDataSources">  
  25.             <map key-type="java.lang.String">  
  26.                 <entry key="ORCL" value-ref="orclDataSource"></entry>  
  27.                 <entry key="ISC" value-ref="iscDataSource"></entry>  
  28.             </map>  
  29.         </property>  
  30.         <property name="defaultTargetDataSource" ref="orclDataSource">  
  31.         </property>  
  32.     </bean>  
  33.   
  34.     <bean id="sessionFactory"  
  35.         class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
  36.         <property name="dataSource" ref="dataSource" />  
  37. </bean>  

 

5、使用

   @Test

Java代码   收藏代码
  1. public void testSave() {  
  2.     // hibernate创建实体  
  3.     DynamicDataSourceHolder.setDataSourceType(DynamicDataSourceGlobal.ORCL);// 设置为另一个数据源  
  4.     com.wy.domain.Test user = new com.wy.domain.Test();  
  5.   
  6.     user.setName("WY");  
  7.     user.setAddress("BJ");  
  8.   
  9.     testDao.save(user);// 使用dao保存实体  
  10.   
  11.     DynamicDataSourceHolder.setDataSourceType(DynamicDataSourceGlobal.ISC);// 设置为另一个数据源  
  12.   
  13.     testDao.save(user);// 使用dao保存实体到另一个库中  
  14.   
  15. }  
  1.        


用spring 的AbstractRoutingDataSource解决了这个问题。

原理如图:

 

项目采用的是hibernate,直接在spring.xml设置sessionFactory的dataSource属性为动态数据源即可。

因为项目所有数据库结构都一致,为了避免每次设置数据源的时候要改一堆参数,修改了springAbstractRoutingDataSource类增加了一个getTargetDataSources方法,获取当前数据源详细信息,在其基础上修改数据库名称、用户名、密码即可,不用每次设置一堆参数。

Java代码   收藏代码
  1. Map<String, ComboPooledDataSource> targetDataSources = dynamicDataSource  
  2.                 .getTargetDataSources();  
  3.         if (targetDataSources == null) {  
  4.             targetDataSources = new HashMap<String, ComboPooledDataSource>();  
  5.             targetDataSources.put("baseDataSource", baseDataSource);  
  6.         }  
  7.         targetDataSources.put(dataSourceName, subSystemDataSource);  
  8.         dynamicDataSource.setTargetDataSources(targetDataSources);  
  9.         dynamicDataSource.afterPropertiesSet();  
 

另外,设置AbstractRoutingDataSource参数后要调用afterPropertiesSet()方法,spring容器才会进行加载操作。

 

在动态设置数据源方面,可以通过两种方式实现:

  1. 在action(项目使用struts)中进行设置,可以确保在每个servlet线程中数据源是一致的。
  2. 以aop方式,对service方法进行拦截,根据需求设置不同数据源。



浅谈使用Spring多数据源路由AbstractRoutingDatasource实现动态切换数据源 使用Spring多数据源路由AbstractRoutingDatasource实现动态切换数据源 阅读详情

相关推荐

Spring(AbstractRoutingDataSource)实现动态数据源切换示例

本篇文章主要介绍了详解Spring(AbstractRoutingDataSource)实现动态数据源切换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

AbstractRoutingDataSource详解,分析多数据源切换原理

在spring中有一个抽象类AbstractRoutingDataSource类,通过这个类可以实现动态数据源切换。如下是这个类的成员变量 // 是存储将要切换的多数据源bean信息,一般是<beanName,DataSource-bean> private Map<Object, Object> targetDataSources; private Object defaultTargetDataSource; private Map<Object, DataSource

stay foolish 1万+

Oracle EBS R12.2 安装 -- Step by Step

Oracle EBS R12.2 安装 -- Step by Step

Albert Tan DBA之路 1513

Spring.动态数据源AbstractRoutingDataSource (分库组件,原理分析,源码,实现代码)

分析和设计 如果需要动态数据源,实现一个DataSource代理,在获取Connection时做手脚。 说明:一个请求进来,数据源对象不能变的,获取的Connection是每次都需要获取的。搞一个数据源代理对象,然后在getConnection方法返回不同数据源Connection。 AbstractRoutingDataSource Spring提供的版本 追getConnection方法: 看看protected DataSource determineTargetDat...

记录 分享 成就 5210

2024.6.15丨基于VFDB数据库的致病菌毒力因子注释实战指南

本文提供了一份基于VFDB数据库进行致病菌毒力因子本地化注释的实战指南。详细介绍了从环境准备、DIAMOND工具安装、VFDB数据库选择与构建,到核心比对操作及结果解读与过滤的全流程。重点阐述了本地化分析相较于在线工具在速度、稳定性和批量处理上的优势,旨在帮助微生物基因组研究人员高效、精准地识别致病菌的关键毒力因子。

weixin_29220405的博客 272

Orale EBS R12 AP应付模块 发票导入接口(Interface)

ap_interface_groups_s.nextval; ap_invoices_interface_s.nextval; ap_invoice_lines_interface_s.nextval; SELECT * FROM ap_invoices_interface ih; SELECT * FROM ap_invoice_lines_interface il; SELECT * FROM...

qq_41206741的博客 3316

动态数据源-spring-AbstractRoutingDataSource

spring的动态数据源AbstractRoutingDataSource本质用的是多态和本地线程栈使用场景:当一个系统中需要多个数据库参与,我公司的业务是每个公司一个数据库,多个公司用同一个域名同一个网站,用的公司名(公司号)登录时。

weixin_39937571的博客 6586

VSCODE 安装LATEX环境,参数配置,常见问题解决

1 准备Texlive安装包 可以从以下网址下载 texlive 的镜像文件: 华为镜像 阿里镜像 官网 网址中大概文件构成 下载完后我们需要的文件构成(我是2020年下载过了,这次就不重新下载了) 将这个镜像文件进行解压 2 安装Texlive 右键install-tl-windows.bat,单击以管理员身份运行,进入安装界面. 点击左下角的“Advanced”进入高级安装来取消你不需要安装的宏包。 点击“Customize”来取消勾选不需要的宏包。 单是把非中英的语言包取消勾选可以省掉 1G

呆呆象呆呆的博客 6万+

利用AbstractRoutingDataSource实现动态数据源切换 (一、Spring+Hibernate)

一、开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能。所以在出来数据库方言的时候基本上没有什么问题,但唯一可能出现问题的就是在hibernate做添加操作生成主键策略的时候。因为我们都知道hibernate的数据库本地方言会针对不同的数据库采用不同的主键生成策略。 所以针对

u010395804的专栏 2931

【深度学习驱动流体力学】完整配置安装 OpenFOAM 及其所需的ThirdParty与QT5工具

针对以上文件及文件目录介绍其功能特性:Allclean:这是一个脚本或命令,通常用于清理(即删除)所有编译生成的临时文件和目标文件。执行后,可以将编译过程中生成的中间文件和已编译的程序删除,以便重新开始编译或者清理空间。Allwmake:这是一个脚本或命令,用于编译并安装ThirdParty-10目录中的所有软件包。执行此命令会遍历所有子目录,编译其中的软件包并将它们安装到指定位置。这是一个脚本或命令,用于编译和安装Libccmio库。

源代码杀手的博客 1997

冷门但实用:Python爬取微信公众号历史文章,突破微信反爬限制(2025有效)

2025年微信公众号爬取的核心是「冷门方法+指纹伪装」,而非常规接口破解,itchat-uos+Playwright组合是突破设备指纹的关键;登录态持久化、动态Token实时获取、频率严格控制是避免被封禁的三大核心;文章内容解析需解决2025新增的编码混淆问题,chardet+BeautifulSoup是冷门但有效的方案;合规是前提,爬取频率、数据用途需严格遵守平台/法律规则。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 3778

利用AbstractRoutingDataSource实现动态数据源切换 (二、Spring+Hibernate)

用spring 的AbstractRoutingDataSource解决了这个问题。 原理如图:   项目采用的是hibernate,直接在spring.xml设置sessionFactory的dataSource属性为动态数据源即可。 因为项目所有数据库结构都一致,为了避免每次设置数据源的时候要改一堆参数,修改了spring AbstractRoutingDataSour...

To Strive To Seek To Find Not To Yield 399

【软考】高项论文写作常见模板

本文主要介绍了YYYY年MM月DD日,我所在公司承接了XXXX项目的建设过程,包括了XXX,XXX,XXX内容,涉及到XXX,XXX,XXX技术。本人在项目中承载着项目经理的角色,主要负责了XXX,XXX,XXX方面事宜。此项目时间紧,任务重,实施过程中,我们特别注重了1、XXX 2、XXX 3、XXX几个方面,经过团队的一致努力,本项目按时交付,运行至今,客户反馈良好。但是在实施过程中,也曝露除了一些问题,包括了XXX,XXX等,通过应急处理和协调,这些问题都得到了妥善解决,没有影响到项目进度。

奶爸的编程之路,也就一周冷个三天 1687

Spring(AbstractRoutingDataSource)实现动态数据源切

Spring(AbstractRoutingDataSource)实现动态数据源切换 一、前言 近期一项目A需实现数据同步到另一项目B数据库中,在不改变B项目的情况下,只好选择项目A中切换数据源,直接把数据写入项目B的数据库中。这种需求,在数据同步与定时任务中经常需要。 那么问题来了,该如何解决多数据源问题呢?不光是要配置多个数据源,还得能灵活动态的切换数据源。以spring+hibernate框架项目为例(引用:http://blog.youkuaiyun.com/wangpeng047/article/detai

happyxin_的博客 551

【AI大模型:认知升级】1、全面解析AI大模型:从起源到发展脉络与应用价值

AI大模型是具备超大规模参数(千亿至万亿级)、海量训练数据(TB级)和强迁移学习能力的基础模型。其技术特征包括Transformer架构革新、大数据预训练范式及参数规模超过临界值后的能力涌现。发展历程经历了语言模型突破(2018-2020)、多模态融合(2021-2023)和架构创新(2023至今)三波浪潮,遵循数据、算力、算法协同进化规律。底层驱动因素包括能力涌现机制、算力基础设施突破和应用场景拓展,正在重构产业价值链。通过"知识星系""认知

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 2293

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

关于spring-hibernate中,多数据源配置的一种实现方法(通过AbstractRoutingDataSource)

关于spring-hibernate中,多数据源配置的一种实现方法(通过AbstractRoutingDataSource) 最近项目中需要用到动态切换数据源且希望做到最少的操作配置,于是研究了一番(网上copy),自己总结了一些容易出问题的地方: AbstractRoutingDataSource 实现切换数据源的原理 数据源配置 代码示例 AbstractRoutingDataS...

zmf21690102的博客 1007

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

datagridview绑定数据源不显示_Spring实现动态数据源

引子 数据源这个词大家并不陌生,但什么是动态数据源呢?动态数据源是为了解决一个项目需连接多个数据源并可在开发过程中根据场景动态切换数据源的问题。所谓动态即不是写死的连接那个数据库,而是根据需要判定连接哪个数据库。最常见的场景就是读写分离,查询连读库,其他的连写库。下面我们以Spring+Hibernate框架为例,看如果实现。 单个数据源绑定给sessionFactory,再在Dao层操作,若多个...

weixin_39852953的博客 292

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

datasource数据源_Spring实现动态数据源

引子 数据源这个词大家并不陌生,但什么是动态数据源呢?动态数据源是为了解决一个项目需连接多个数据源并可在开发过程中根据场景动态切换数据源的问题。所谓动态即不是写死的连接那个数据库,而是根据需要判定连接哪个数据库。最常见的场景就是读写分离,查询连读库,其他的连写库。下面我们以Spring+Hibernate框架为例,看如果实现。 单个数据源绑定给sessionFactory,再在Dao层操作,若多个...

weixin_39947351的博客 781

利用Spring的AbstractRoutingDataSource解决多数据源的问题

一、前言     近期一项目A需实现数据同步到另一项目B数据库中,在不改变B项目的情况下,只好选择项目A中切换数据源,直接把数据写入项目B的数据库中。这种需求,在数据同步与定时任务中经常需要。     那么问题来了,该如何解决多数据源问题呢?不光是要配置多个数据源,还得能灵活动态的切换数据源。以spring+hibernate框架项目为例(引用:http://blog.youkuaiyun.com

shenjianxz的博客 1478

Spring(AbstractRoutingDataSource)实现动态数据源切换

原始出处:http://linhongyu.blog.51cto.com/6373370/1615895前言近期一项目A需实现数据同步到另一项目B数据库中,在不改变B项目的情况下,只好选择项目A中切换数据源,直接把数据写入项目B的数据库中。这种需求,在数据同步与定时任务中经常需要。那么问题来了,该如何解决多数据源问题呢?不光是要配置多个数据源,还得能灵活动态的切换数据源。以spring+hibern

jonathan的专栏 2344

Spring(AbstractRoutingDataSource)实现动态数据源切换--转载

原始出处:http://linhongyu.blog.51cto.com/6373370/1615895 一、前言     近期一项目A需实现数据同步到另一项目B数据库中,在不改变B项目的情况下,只好选择项目A中切换数据源,直接把数据写入项目B的数据库中。这种需求,在数据同步与定时任务中经常需要。     那么问题来了,该如何解决多数据源问题呢?不光是要配置多个数据源

switch513的博客 337

Spring(AbstractRoutingDataSource)实现动态数据源切换-- 转载

spring(AbstractRoutingDataSource)实现动态加载分布式数据库,配置多个数据源并实现动态切换!

it_java_shuai的博客 330
上一篇: jsp获取项目路径(二)
下一篇: 利用AbstractRoutingDataSource实现动态数据源切换(Spring+Ibatis)
JavaAlpha
博客等级 码龄18年 910粉丝 511原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值