论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
从单数据源到多数据源的探讨
从单数据源到多数据源的探讨
伤心客
金牌会员
|
2025-1-18 16:52:42
|
显示全部楼层
|
阅读模式
楼主
主题
878
|
帖子
878
|
积分
2634
今天我想简单地分享一下如何将一个老项目从单数据源切换为多数据源的过程。这个项目是一个利用 WAR 部署的传统 JSP Web 项目,运行在 JDK 1.7 环境下,项目中并没有利用 Spring Boot,而仅仅采用了 Spring MVC 框架。我的主要使命是将本来利用单一数据源的架构,升级为支持多数据源的架构。
为此,首先需要梳理清楚当前项目的模块依赖和数据源的利用情况,了解项目中所有的模块和类是如何引用和交互的,特别是涉及到数据库操纵的部分。
引用排查
我也很直接,直接找到datasource关键字直接全局搜索,找到了很多引用地方,有些确实是命名不是很规范,并不是数据源也起名叫了这个名字,第一步直接去除没有效的相关类,做一个简单的筛除。如图所示:
接下来,我将剩余的引用部分划分为三个主要部分,具体如下:第一部分是与XML配置相关的内容。由于该项目是一个较为传统的Spring MVC老项目,因此所有的Bean依赖关系都是在XML文件中显式配置的。这一部分的工作主要是分析和梳理XML配置文件中与Bean定义及依赖注入相关的内容。
第二部分是Java引用的相关内容。对于一些XML中配置好的Bean,这些配置会被注入到Java类的相应位置,并在运行时利用。因此,这一部分需要重点关注那些通过XML配置注入的Bean以及它们在Java代码中的应用场景。
最后第三部分是关于properties配置文件的检查。需要检查是否有单独的配置项存在于properties文件中,这些配置项大概会影响体系的某些行为或参数设置。
业务梳理
这部分不太好说,需要自己对整个项目有所掌握才可以,要不然会让自己看的头疼,这部分看的时候,大概想了一下为什么这里这么用,这里用到数据源做了哪些业务,假如切换成多数据源后,应该如何处理。
我大概看了一下有根本下面几种情况:
注入数据源,直接生成jdbctemplate对象后,在代码里写业务逻辑执行SQL,看的头疼~~
注入到sqlsessionfactorybean中,集成到mybatis中。
利用现成的spring-security,注入数据源后,直接查询各种权限信息。
国际化配置利用到了数据源信息。
目前就这几种,因为项目利用的是jndi的方式注入,以是对于多数据源来说也有一些困难。不过我的大概思路就是将数据源注入个默认数据源,利用动态key的方式切换数据源。
后期思路
比如,配置文件首先就需要有多个数据源的信息,如下所示:
<bean id="dataSource1" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db1"/>
<property name="username" value="user1"/>
<property name="password" value="pass1"/>
</bean>
<bean id="dataSource2" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db2"/>
<property name="username" value="user2"/>
<property name="password" value="pass2"/>
</bean>
<bean id="sqlSessionFactory" >
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="dataSource1" value-ref="dataSource1"/>
<entry key="dataSource2" value-ref="dataSource2"/>
</map>
</property>
</bean>
复制代码
定义数据源路由
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSourceKey(String key) {
contextHolder.set(key);
}
public static String getDataSourceKey() {
return contextHolder.get();
}
public static void clearDataSourceKey() {
contextHolder.remove();
}
}
复制代码
配置动态数据源
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceKey();
}
}
复制代码
集成到SqlSessionFactoryBean,在 ReloadableSqlSessionFactoryBean 中利用动态数据源:
public class MySqlSessionFactoryBean extends SqlSessionFactoryBean implements DisposableBean {
private static final Log log = LogFactory.getLog(MySqlSessionFactoryBean.class);
private AbstractRoutingDataSource routingDataSource;
public void setTargetDataSources(Map<Object, Object> targetDataSources) {
if (routingDataSource == null) {
routingDataSource = new DynamicDataSource();
}
routingDataSource.setTargetDataSources(targetDataSources);
routingDataSource.setDefaultTargetDataSource(targetDataSources.values().iterator().next());
super.setDataSource(routingDataSource);
}
@Override
protected SqlSessionFactory buildSqlSessionFactory() throws Exception {
return super.buildSqlSessionFactory();
}
@Override
public void destroy() throws Exception {
// 清理资源
}
}
复制代码
在需要切换数据源的地方调用 DataSourceContextHolder.setDataSourceKey("dataSource1") 或 DataSourceContextHolder.setDataSourceKey("dataSource2")。
总的来说,将传统单数据源架构迁徙到多数据源架构并不简单,但通过合理的模块梳理和逐步推进,整个过程可以得到有效实施。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
伤心客
金牌会员
这个人很懒什么都没写!
楼主热帖
Java打怪之路----谷粒商场认证服务 ...
《百万IT毕业生的心声:IT专业大学生毕 ...
xtrabackup2版本和xtrabackup8版本对比 ...
原型设计工具比较及实践--滴爱音乐 ...
Excelize 发布 2.6.1 版本,支持工作簿 ...
sqlserver导入sql文件的方式
基于 SpringBoot + MyBatis 的博客系统 ...
Flink-使用流批一体API统计单词数量 ...
JavaSE笔记
Snowflake(雪花算法),什么情况下会 ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表