Spring动态数据源的简单理解

news2024/11/18 23:01:17

连接数据库时,需要url,userName,和password,怎么做到动态呢,那就是在使用时,根据你的设置,去连接不同的url,userName,和password,实现数据源的切换。

1.先写一个类来放数据源的key。

public class DataSourceKeyHolder {
    private static final ThreadLocal<String> keyHolder = new ThreadLocal<>();

    public static void setKey(String key) {
        keyHolder.remove();
        keyHolder.set(key);
    }

    public static String getKey() {
        String s = keyHolder.get();
        Assert.notNull(s, "key 不能为空");
        return s;
    }
    public static void clear(){
        keyHolder.remove();
    }
}

2.写一个类继承extends AbstractRoutingDataSource

public class MyDynamicDataSource extends AbstractRoutingDataSource{

    /**
     * Determine the current lookup key. This will typically be
     * implemented to check a thread-bound transaction context.
     * <p>Allows for arbitrary keys. The returned key needs
     * to match the stored lookup key type, as resolved by the
     * {@link #resolveSpecifiedLookupKey} method.
     */
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceKeyHolder.getKey();
    }
}
可以看到重写了determineCurrentLookupKey方法,里面的key值是取的DataSourceKeyHolder类线程里面我们自定义的key。
重写的determineCurrentLookupKey会根据你自定义的key取出resolvedDataSources这个map中的DataSource

 3.以@Bean注入需要连接的数据库参数。

@Configuration
public class DynamicSataSourceConfig {

    @Bean
    public DriverManagerDataSource dataSource1() {
        String url = "jdbc:mysql://localhost:3306/whw_test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai\n";
        String userName = "root";
        String password = "zaq12wsX";
        return new DriverManagerDataSource(url, userName, password);
    }

    @Bean
    public DriverManagerDataSource dataSource2() {
        String url = "jdbc:mysql://localhost:3306/whw_test2?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai\n";
        String userName = "root";
        String password = "zaq12wsX";
        return new DriverManagerDataSource(url, userName, password);
    }

    @Bean
    public DriverManagerDataSource dataSource3() {
        String url = "jdbc:mysql://localhost:3306/whw_test3?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai\n";
        String userName = "root";
        String password = "zaq12wsX";
        return new DriverManagerDataSource(url, userName, password);
    }

    @Bean
    public MyDynamicDataSource dynamicDataSource(Map<String, DriverManagerDataSource> map) {
        HashMap<Object, Object> original = new HashMap<>(map);
        MyDynamicDataSource myDynamicDataSource = new MyDynamicDataSource();
        myDynamicDataSource.setTargetDataSources(original);
        return myDynamicDataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(AbstractRoutingDataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

}

setTargetDataSources方法  把@Bean注入的数据源参数,从targetDataSources复制到resolvedDataSources这个map。

 4.写个测试类

public class DynamicSataSourceTest {
    public static void main(String[] args) {
        try {
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DynamicSataSourceConfig.class);
            JdbcTemplate jdbcTemplate = context.getBean(JdbcTemplate.class);
            dataSource1(jdbcTemplate);
            dataSource2(jdbcTemplate);
            dataSource3(jdbcTemplate);
        }catch (Exception e){
            e.printStackTrace();
        }

    }
    public static void dataSource1(	JdbcTemplate jdbcTemplate ){
        DataSourceKeyHolder.setKey("dataSource1");
        try {
            UserBean testBean = jdbcTemplate.queryForObject("select * from t_test where id=?", new BeanPropertyRowMapper<>(UserBean.class), 1);
            System.out.println(testBean);
        }finally {
            DataSourceKeyHolder.clear();
        }
    }
    public static void dataSource2(	JdbcTemplate jdbcTemplate ){
        DataSourceKeyHolder.setKey("dataSource2");
        try {
            UserBean testBean = jdbcTemplate.queryForObject("select * from t_test where id=?", new BeanPropertyRowMapper<>(UserBean.class), 1);
            System.out.println(testBean);
        }finally {
            DataSourceKeyHolder.clear();
        }
    }
    public static void dataSource3(	JdbcTemplate jdbcTemplate ){
        DataSourceKeyHolder.setKey("dataSource3");
        try {
            UserBean testBean = jdbcTemplate.queryForObject("select * from t_test where id=?", new BeanPropertyRowMapper<>(UserBean.class), 1);
            System.out.println(testBean);
        }finally {
            DataSourceKeyHolder.clear();
        }
    }
}

需要连接哪个数据库,在使用sql前DataSourceKeyHolder.setKey("dataSource1");

然后根据我们设定的 数据源key去读取相应的DataSource。

输出结果:

 UserBean(id=1, name=test_mary, age=3.0)
UserBean(id=1, name=test2_mary, age=3.0)
UserBean(id=1, name=test3_mary, age=3.0)

 切换成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/125117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaScript】JS飞机大战网页简易版

文章目录一、效果演示设计思路二、鼠标版飞机大战代码展示1.HTML结构代码2.CSS样式代码3.JavaScript代码js.js文件plane.js文件三、键盘版飞机大战代码展示1.HTML结构代码2.CSS样式代码3.JavaScript代码四、代码资源分享一、效果演示 利用html&#xff0c;css&#xff0c;js制…

php进程管理

PHP-FPM 先来了解一些名词概念&#xff1a; CGI是Common Gateway Interface&#xff08;通用网管协议&#xff09;&#xff0c;用于让交互程序和Web服务器通信的协议。它负责处理URL的请求&#xff0c;启动一个进程&#xff0c;将客户端发送的数据作为输入&#xff0c;由Web服…

首发!飞凌嵌入式i.MX9系列核心板重磅发布

来源&#xff1a;飞凌嵌入式官网www.forlinx.com为了让更多设备实现高能效、高安全性和智能化升级&#xff0c;NXP推出了全新的i.MX 93x系列处理器。作为NXP的重要合作伙伴&#xff0c;飞凌嵌入式在i.MX 9352的α阶段便进行该款处理器的产品研发工作。今天&#xff0c;飞凌嵌入…

HNU编译原理实验三cminus_compiler-2022-fall

前言&#xff1a;实验难度再次提升&#xff0c;不过会一个就可以做其他部分&#xff0c;很多都是相同的&#xff0c;个人认为更难的还是配置环境部分&#xff0c;真的会折磨死人 lab3 实验报告实验要求 第一部分: 了解LLVM IR。通过clang生成的.ll&#xff0c;了解LLVM IR与c代…

Windows10下CLion配置说明

Windows10下CLion配置说明 CLion 是 C/C的 IDE&#xff0c;可以配置多种编译环境&#xff0c;本文以配置MinGW编译环境为例。 安装 CLion 的安装可直接到官网下载 ZIP,文件解压后直接运行即可。我在安装过程中没有遇到困难&#xff0c;网上关于安装的教程很多&#xff0c;如…

TCP连接积压导致服务假死问题

目录 一、事故表现 二、事故问题分析 三、测试环境重现 四、解决方案 一、事故表现 2022-01-14日凌晨00:00开始&#xff0c;TCP_alloc&#xff1a;已分配TCP连接&#xff0c;一直未释放。导致未释放的 TCP连接一直积压。最终服务LOGISTICS-DS-ES-COMMON-SERVICE假死&#x…

jenkins下载安装

目录 1.下载安装 2.初始化配置 3.新建项目 3.1.安装插件 3.2.配置项目 3.2.1.选择项目类型 3.2.1.源码管理 3.3.3.配置maven 1.下载安装 安装清单&#xff1a; JDK 1.8Maven 3.6.3gitJenkins 2.334 环境&#xff1a; centos 7 Jenkins是JAVA编写的&#xff0c;需要JDK环…

年终报告:通过3个维度,回看2022全球电商市场的“多样性”

回顾年中&#xff0c;各国由于经济政策的调整导致贸易壁垒的层层叠加&#xff0c;也有非常复杂多变的因素在发酵&#xff0c;今年下半年突然爆发的俄乌两国的冲突使得原来就脆弱的全球经济再次遭受动荡&#xff0c;这一系列的动荡因素直接导致了今年全球经济的整体不景气&#…

鼠标拖拽菜单栏控制宽度大小及flex实现经典左右两栏布局

目录 1. 实现的效果如下图所示&#xff1a; 2. 思路 3.代码 3.1 js核心代码简单理解版&#xff1a; 3.2 实际应用-react版 4. 使用flex实现左右两栏式经典布局 4.1 图示&#xff1a; 4.2 代码实例&#xff1a; 1. 实现的效果如下图所示&#xff1a; 2. 思路 1. 使用定…

欧科云链接受北京电视台采访以创新科技助力《反电信网络诈骗法》

近日&#xff0c;欧科云链作为创新科技企业的代表&#xff0c;就《反电信网络诈骗法》实施的相关问题接受了来自北京电视台的采访。 编辑&#xff5c;小O 出品&#xff5c;欧科云链 近年来&#xff0c;随着数字技术的快速发展&#xff0c;越来越多的交易都转移到线上&#xff0…

softnms源码解读(python)

前言 想写这篇文章的原因是最近碰见了一个比较棘手的事情&#xff0c;如果想把一个目标检测模型及其相关的后处理移到嵌入式设备上&#xff0c;不能用c的opencv库&#xff0c;也就不能用cv2.dnn.nms这个函数来进行nms的后处理&#xff0c;需要用c实现&#xff0c;那就必须了解…

重磅综述|Nat Rev Gastroenterol Hepatol:人类胃肠道中的产甲烷古菌

期刊&#xff1a;Nat Rev Gastroenterol Hepatol 影响因子&#xff1a;73.082 发表时间&#xff1a;2022年9月 一、摘要 人类微生物群与人类健康和疾病密切相关。除了细菌、病毒和真核生物外&#xff0c;人类胃肠道中许多古菌与甲烷的产生有关&#xff0c;临床上可…

PMP一般要提前多久备考?

一般是1-3个月吧&#xff0c;PMP考试通过率至少有60%&#xff0c;报培训班可以有80%以上&#xff0c;不用备考太长时间&#xff0c;但时间太短也无法把项目管理的知识学完&#xff0c;1-3个月是最佳备考时间。 &#xff08;字数很多&#xff0c;都是干货&#xff0c;资料在文末…

写给Java程序员的GRPC入门系列(1)

点击上方GRPC专栏看系列 文章目录Abstract前置依赖本文初始状态创建MAVEN module修改依赖测试下一步Abstract 网上有很多GRPC的例子&#xff0c;但是却没有能够写给普通Java开发人员手把手入门少走弯路的教程。 本教程保证按照步骤一步步来你就可以完成GRPC从0到1的构建。 源码…

一文读懂机器学习常用算法的基本概念和适用场景

引用一句英国统计学家George E. P. Box的名言&#xff1a;All models are wrong, but some are useful. 没有哪一种算法能够适用所有情况&#xff0c;只有针对某一种问题更有用的算法。 机器学习算法不会要求一个问题被 100%求解&#xff0c;取而代之的是把问题转化为最优化的…

基于小程序技术栈的跨端框架有哪些?

回顾过去的几年&#xff0c;市场上的跨端开发框架一直在迭代&#xff0c;同时也有新的跨端框架冒出来。在过往的文章中&#xff0c;我们也有盘点过基于HTML5语法实现的跨端开发平台。在本篇文章中&#xff0c;就让我们盘点一下以小程序语法进行转译的跨端平台&#xff0c;以及他…

相机标定笔记(1) -- 相机模型

什么需要相机标定 我们知道&#xff0c;相机的图像是三维世界到2D平面的一个投影。仅从这个2D图像来看&#xff0c;我们无法得知图像中的物体在真实物理世界中有多大&#xff0c;距离相机的距离有多远。那么我们有没有办法从这个2D的图片结合相机的参数获得这些信息呢&#xff…

ElasticSearch-全文检索

docker 下载安装 #es镜像 docker pull elasticsearch:7.4.2 #es的可视化工具 docker pull kibana:7.4.2mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/dataecho "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsear…

2023年北京/成都/南宁山东DAMA-CDGA/CDGP数据治理工程师认证报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

制造业ERP软件如何破解企业质量管理难题?

随着生产制造企业的快速发展&#xff0c;产品的好坏&#xff0c;在很大程度上取决于产品制造的质量管理水平&#xff0c;其水平的高低直接对应产品的竞争力。许多企业都面临着质量管控能力不足、质量检验数据记录不全、部分物料追溯困难等问题&#xff0c;一旦企业的产品出现质…