小码农的代码(三)----------SpringJDBC多数据源应用

2024-09-04 12:38

本文主要是介绍小码农的代码(三)----------SpringJDBC多数据源应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前面项目中基础的SpringJdbc的配置说明已经简单总结,接下去就是项目中使用到多数据源这个问题了。 
对于多数据源的实现,我的想法是首先配置多个数据源,然后在数据操作时通过切换数据源的方式来达到目的,那么如何在保持jdbctmplate只有一个的时候进行数据源切换呢,我考虑到可以起一个线程来实现在操作中的自由切换。 
首先配置3个数据源,为方便测试就直接在本机新建了三个mysql数据库(实际过程中是使用mysql与多个sql server)来写测试用例
Java代码   收藏代码
  1. <bean id="defaultDateSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
  2.         destroy-method="close">  
  3.         <property name="driverClass" value="${jdbc.driverClass}" />  
  4.         <property name="jdbcUrl" value="${jdbc.jdbcUrl}" />  
  5.         <property name="user" value="${jdbc.user}" />  
  6.         <property name="password" value="${jdbc.password}" />  
  7.     </bean>  
Java代码   收藏代码
  1. <bean id="dataSource01" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
  2.         destroy-method="close">  
  3.         <property name="driverClass" value="${jdbc.driverClass01}" />  
  4.         <property name="jdbcUrl" value="${jdbc.jdbcUrl01}" />  
  5.         <property name="user" value="${jdbc.user01}" />  
  6.         <property name="password" value="${jdbc.password01}" />  
  7.     </bean>  
Java代码   收藏代码
  1. <bean id="dataSource02" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
  2.         destroy-method="close">  
  3.         <property name="driverClass" value="${jdbc.driverClass02}" />  
  4.         <property name="jdbcUrl" value="${jdbc.jdbcUrl02}" />  
  5.         <property name="user" value="${jdbc.user02}" />  
  6.         <property name="password" value="${jdbc.password02}" />  
  7.     </bean>  
习惯使用c3p0数据库连接池,下次尝试试用下阿里DruidDataSource,据说功能更加强大,但是一直没有使用过-,-跑题了 新建三个数据库还是只有一个表user(id,name,age;id逐渐自增)。 
然后新建一个单例的线程ThreadLocal(这是一个很好用的东西,下次专门写个测试用例总结下,做项目总是能够不断的引出新的东西,这点真的很好),能够set/get/remove数据源
Java代码   收藏代码
  1. public class DatabaseContextHolder {  
  2.     private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();  
  3.   
  4.     public static void setDateBaseType(String database) {  
  5.         Assert.notNull(database, "DatabaseType cannot be null");  
  6.         contextHolder.set(database);  
  7.     }  
  8.   
  9.     public static String getDateBaseType() {  
  10.         return contextHolder.get();  
  11.     }  
  12.   
  13.     public static void clearDatabaseType() {  
  14.         contextHolder.remove();  
  15.     }  
  16. }  

接下来是Spring支持多数据源切换的核心类AbstractRoutingDataSource,新建一个继承这个抽象类的子类DynamicDataSource,并实现determineCurrentLookupKey方法(抽象类与接口的相似性
Java代码   收藏代码
  1. public class DynamicDataSource extends AbstractRoutingDataSource {  
  2.   
  3.     @Override  
  4.     protected Object determineCurrentLookupKey() {  
  5.         return DatabaseContextHolder.getDateBaseType();  
  6.     }  
  7. }  

继续回到spring的配置文件,通过DynamicDataSource管理多数据源,并设置默认的数据源
Java代码   收藏代码
  1. <bean id="dynamicDataSource" class="com.zh.demo.base.tool.DynamicDataSource">  
  2.         <property name="targetDataSources">  
  3.             <map key-type="java.lang.String">  
  4.                 <entry value-ref="defaultDateSource" key="defaultDateSource"></entry>  
  5.                 <entry value-ref="dataSource01" key="dataSource01"></entry>  
  6.                 <entry value-ref="dataSource02" key="dataSource02"></entry>  
  7.             </map>  
  8.         </property>  
  9.         <property name="defaultTargetDataSource" ref="defaultDateSource">  
  10.         </property>  
  11.     </bean>  
当然jdbctemplate中指向的数据源也需要切换成它
Java代码   收藏代码
  1. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
  2.         <property name="dataSource" ref="dynamicDataSource" />  
最后新建一个DataBaseType类与配置中的数据源名称相关联
Java代码   收藏代码
  1. public class DataBaseType {  
  2.     public static final String DATABASE_DEFAULT = "defaultDateSource";  
  3.     public static final String DATABASE_01 = "dataSource01";  
  4.     public static final String DATABASE_02 = "dataSource02";  
  5. }  
这样就可以写测试用例了。 
简单的新增语句在测试类中进行数据库切换
Java代码   收藏代码
  1. public void test(){  
  2.         userService.saveUser(("insert into user (name,age)values('张三',13)");  
  3.         DatabaseContextHolder.clearDatabaseType();  
  4.         DatabaseContextHolder.setDateBaseType(DataBaseType.DATABASE_01);  
  5.         userService.saveUser("insert into user (name,age)values('张三',13)");  
  6.         DatabaseContextHolder.clearDatabaseType();  
  7.         DatabaseContextHolder.setDateBaseType(DataBaseType.DATABASE_02);  
  8.         userService.saveUser("insert into user (name,age)values('张三',13)");  
  9.     }  
结果是三个数据库中都插入了数据,多数据源配置成功。 
注意点与总结: 
一、实际项目中发现一个问题,就是在同一个事务中不能够进行数据库切换,该问题暂时未解决,有方法的朋友可以的话烦请指导下。 
二、在使用过程中扩展想到能否通过请求来动态的切换数据源,目前考虑到还是需要在请求中带参数来让后台识别进行数据库切换,不知道有没有更好的方法。 
以下内容如存在错误之处烦请斧正以达到共同进步的效果,多谢。
  • SpringJDBC_多数据源_.rar (33.4 KB)
  • 下载次数: 6

这篇关于小码农的代码(三)----------SpringJDBC多数据源应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136047

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能