前言

Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性。而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据。
Spring2.x以后的版本中采用Proxy模式,就是我们在方案中实现一个虚拟的数据源,并且用它来封装数据源选择逻辑,这样就可以有效地将数据源选择逻辑从Client中分离出来。Client提供选择所需的上下文(因为这是Client所知道的),由虚拟的DataSource根据Client提供的上下文来实现数据源的选择。
实现
具体的实现就是,虚拟的DataSource仅需继承AbstractRoutingDataSource实现determineCurrentLookupKey()在其中封装数据源的选择逻辑。
一、动态配置多数据源
1. 数据源的名称常量类:
/**
* 动态配置多数据源
* 数据源的名称常量类
* @author LONGHUI_LUO
*
*/
public class DataSourceConst {
public static final String TEST="test";
public static final String USER="User";
}
2. 建立一个获得和设置上下文环境的类,主要负责改变上下文数据源的名称:
/**
* 获得和设置上下文环境 主要负责改变上下文数据源的名称
*
* @author LONGHUI_LUO
*
*/
public class DataSourceContextHolder {
private static final ThreadLocal contextHolder = new ThreadLocal(); // 线程本地环境
// 设置数据源类型
public static void setDataSourceType(String dataSourceType) {
contextHolder.set(dataSourceType);
}
// 获取数据源类型
public static String getDataSourceType() {
return (String) contextHolder.get();
}
// 清除数据源类型
public static void clearDataSourceType() {
contextHolder.remove();
}
}
3. 建立动态数据源类,注意,这个类必须继承AbstractRoutingDataSource,且实现方法determineCurrentLookupKey,该方法返回一个Object,一般是返回字符串:
/**
* 建立动态数据源
*
* @author LONGHUI_LUO
*
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
protected Object determineCurrentLookupKey() {
// 在进行DAO操作前,通过上下文环境变量,获得数据源的类型
return DataSourceContextHolder.getDataSourceType();
}
}
4. 编写spring的配置文件配置多个数据源
<!-- 数据源相同的内容 --> <bean id="parentDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> <property name="username" value="sa" /> <property name="password" value="net2com" /> </bean> <!-- start以下配置各个数据源的特性 --> <bean parent="parentDataSource" id="testDataSource"> <propertynamepropertyname="url" value="jdbc:sqlserver://localhost:1433;databaseName=test" /> </bean> <bean parent="parentDataSource" id="UserDataSource"> <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=User" /> </bean> <!-- end 配置各个数据源的特性 -->
5. 编写spring配置文件配置多数据源映射关系
<bean class="com.xxxx.datasouce.DynamicDataSource" id="dataSource"> <property name="targetDataSources"> <map key-type="java.lang.String"> <entry value-ref="testDataSource" key="test"></entry> <entry value-ref="UserDataSource" key="User"></entry> </map> </property> <property name="defaultTargetDataSource" ref="testDataSource" ></property> </bean>
在这个配置中第一个property属性配置目标数据源,<map key-type="java.lang.String">中的key-type必须要和静态键值对照类DataSourceConst中的值的类型相 同;<entry key="User" value-ref="userDataSource"/>中key的值必须要和静态键值对照类中的值相同,如果有多个值,可以配置多个< entry>标签。第二个property属性配置默认的数据源。
动态切换是数据源
DataSourceContextHolder.setDataSourceType(DataSourceConst.TEST);
该方案的优势
首先,这个方案完全是在spring的框架下解决的,数据源依然配置在spring的配置文件中,sessionFactory依然去配置它的dataSource属性,它甚至都不知道dataSource的改变。唯一不同的是在真正的dataSource与sessionFactory之间增加了一个MultiDataSource。
其次,实现简单,易于维护。这个方案虽然我说了这么多东西,其实都是分析,真正需要我们写的代码就只有MultiDataSource、SpObserver两个类。MultiDataSource类真正要写的只有getDataSource()和getDataSource(sp)两个方法,而SpObserver类更简单了。实现越简单,出错的可能就越小,维护性就越高。
最后,这个方案可以使单数据源与多数据源兼容。这个方案完全不影响BUS和DAO的编写。如果我们的项目在开始之初是单数据源的情况下开发,随着项目的进行,需要变更为多数据源,则只需要修改spring配置,并少量修改MVC层以便在请求中写入需要的数据源名,变更就完成了。如果我们的项目希望改回单数据源,则只需要简单修改配置文件。这样,为我们的项目将增加更多的弹性。
该方案的缺点
没有能够解决多用户访问单例“sessionFactory”时共享“dataSource”变量,导致产生争抢“dataSource”的结果,本质类似于操作系统中的“生产者消费者”问题。因此当多用户访问时,多数据源可能会导致系统性能下降的后果。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
# spring动态切换数据源
# spring动态数据源
# spring
# 多数据源切换
# Spring Boot 动态数据源示例(多数据源自动切换)
# Springboot如何设置多数据源
# 随时切换
# SpringBoot AOP方式实现多数据源切换的方法
# spring boot+mybatis 多数据源切换(实例讲解)
# Spring配置多数据源切换
# Spring整合多数据源实现动态切换的实例讲解
# 详解Spring多数据源如何切换
# Spring通过拦截器实现多数据源切换的示例代码
# 多个
# 配置文件
# 是在
# 只需要
# 多用户
# 键值
# 都是
# 这是
# 就会
# 切分
# 都不
# 在这个
# 第一个
# 必须要
# 说了
# 这么多
# 所需
# 这就
# 第二个
# 有效地
相关文章:
,有什么在线背英语单词效率比较高的网站?
Python如何创建带属性的XML节点
建站之星CMS建站配置指南:模板选择与SEO优化技巧
网站设计制作公司地址,网站建设比较好的公司都有哪些?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
如何访问已购建站主机并解决登录问题?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
制作网页的网站有哪些,电脑上怎么做网页?
公众号网站制作网页,微信公众号怎么制作?
完全自定义免费建站平台:主题模板在线生成一站式服务
如何在西部数码注册域名并快速搭建网站?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
建站之星导航配置指南:自助建站与SEO优化全解析
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
相册网站制作软件,图片上的网址怎么复制?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
如何快速搭建响应式可视化网站?
再谈Python中的字符串与字符编码(推荐)
如何通过网站建站时间优化SEO与用户体验?
实例解析Array和String方法
想学网站制作怎么学,建立一个网站要花费多少?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
c# 在ASP.NET Core中管理和取消后台任务
南京网站制作费用,南京远驱官方网站?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
内网网站制作软件,内网的网站如何发布到外网?
太原网站制作公司有哪些,网约车营运证查询官网?
建站168自助建站系统:快速模板定制与SEO优化指南
如何通过虚拟主机空间快速建站?
如何用y主机助手快速搭建网站?
南平网站制作公司,2025年南平市事业单位报名时间?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
制作门户网站的参考文献在哪,小说网站怎么建立?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
javascript中对象的定义、使用以及对象和原型链操作小结
怀化网站制作公司,怀化新生儿上户网上办理流程?
开封网站制作公司,网络用语开封是什么意思?
深圳网站制作案例,网页的相关名词有哪些?
活动邀请函制作网站有哪些,活动邀请函文案?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
如何在阿里云香港服务器快速搭建网站?
已有域名和空间如何快速搭建网站?
建站主机选哪家性价比最高?
如何快速生成专业多端适配建站电话?
*请认真填写需求信息,我们会在24小时内与您取得联系。