Spring 动态创建并切换数据源
公司要求后端项目可以进行动态创建并切换数据源,看了网上很多例子大多数使用的都是Spring内置的AbstractRoutingDataSource进行的,使用此方法不是不行但是有诸多缺陷,比如切换时需要依赖其ThreadLocal作为依据才可以切换。
AbstractRoutingDataSource可以动态切换数据源的原理,实际上是通过determineCurrentLookupKey方法找出对应的dataSource并通过getConnection方法获取链接。简单来说就是就是从不同的数据源获取不同的数据库链接,由此可以使用另一种更简单的方法来完成。
AbstractRoutingDataSource继承了AbstractDataSource类,而AbstractDataSource类直接继承了DataSource类,所以说我们可以直接继承AbstractDataSource并重写getConnection方法来完成我们的目的。
public class DynamicDataSource extends AbstractDataSource {
private static Logger logger = LoggerFactory.getLogger(DynamicDataSource.class);
private DataSource dataSource;
public DynamicDataSource(@Autowired DruidConfiguration sqliteConfiguration) throws IOException {
dataSource = sqliteConfiguration.dataSource();
}
@Override
public Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
public DruidDataSource getDataSource() {
return (DruidDataSource) dataSource;
}
public void changeDataSource(DruidDataSource newDataSource) {
this.dataSource = newDataSource;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
return getConnection();
}
}
其中DynamicDataSource是我们自定义的java类,他继承了上边提到了AbstractDataSource,只需要实现两个getConnection方法即可。由于我没有用到带参数的getConnection方法,所以未对此方法进行处理。
只要理解了切换的原理是通过getConnection获取不同的数据库链接之后,其余的就很简单了。另外,与AbstractRoutingDataSource相同的一点是使用AbstractDataSource也需要注入一个默认的数据源,所以我在DynamicDataSource的构造方法中自动注入了一个默认的数据源。
经过上文的处理之后,项目启动之后会拥有一个默认的小型数据源(即一个初始的数据源)。当需要进行切换的时候只需要调用其中的changeDataSource方法即可。
示例:
@Autowired
private DynamicDataSource dynamicDataSource; DruidDataSource sqlLiteDataSource = dictService.getOtrpDataSource();
dynamicDataSource.changeDataSource(sqlLiteDataSource);
其中sqlLiteDataSource中的数据来源于数据库,这样的话只需要在需要切换的地方读取并切换就可以了。
Spring 动态创建并切换数据源的更多相关文章
- spring 动态创建数据源
项目需求如下,公司对外提供服务,公司本身有个主库,另外公司会为每个新客户创建一个数据库,客户的数据库地址,用户名,密码,都保存在主数据库中.由于不断有新的客户加入,所以要求,项目根据主数据库中的信息, ...
- spring动态创建数据源
在最近的项目业务中,需要在程序的运行过程中,添加新的数据库添链接进来,然后从新数据库链接中读取数据. 网上查阅了资料,发现spring为多数据源提供了一个抽象类AbstractRoutingDataS ...
- Spring AOP动态切换数据源
现在稍微复杂一点的项目,一个数据库也可能搞不定,可能还涉及分布式事务什么的,不过由于现在我只是做一个接口集成的项目,所以分布式就先不用了,用Spring AOP来达到切换数据源,查询不同的数据库就可以 ...
- Spring动态切换数据源及事务
前段时间花了几天来解决公司框架ssm上事务问题.如果不动态切换数据源话,直接使用spring的事务配置,是完全没有问题的.由于框架用于各个项目的快速搭建,少去配置各个数据源配置xml文件等.采用了动态 ...
- Spring Boot 如何动态切换数据源
本章是一个完整的 Spring Boot 动态数据源切换示例,例如主数据库使用 lionsea 从数据库 lionsea_slave1.lionsea_slave2.只需要在对应的代码上使用 Data ...
- spring动态切换数据源(一)
介绍下spring数据源连接的源码类:| 1 spring动态切换连接池需要类AbstractRoutingDataSource的源码 2 /* 3 * Copyright 2002-2017 the ...
- Spring + Mybatis 项目实现动态切换数据源
项目背景:项目开发中数据库使用了读写分离,所有查询语句走从库,除此之外走主库. 最简单的办法其实就是建两个包,把之前数据源那一套配置copy一份,指向另外的包,但是这样扩展很有限,所有采用下面的办法. ...
- Spring动态切换多数据源解决方案
Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性.而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时 ...
- Spring+Mybatis动态切换数据源
功能需求是公司要做一个大的运营平台: 1.运营平台有自身的数据库,维护用户.角色.菜单.部分以及权限等基本功能. 2.运营平台还需要提供其他不同服务(服务A,服务B)的后台运营,服务A.服务B的数据库 ...
随机推荐
- WPF应用App.Config文件的保存路径
App.Config文件有更改后,自动会保存到以下路径: C:\Users\你的系统用户名\AppData\Local\你的应用名\
- PHP MYSQL 获取记录总数
$qid = mysql_query(“SELECT count(aid) as total FROM table group by aid “);//你的查询 $res = mysql_fetch_ ...
- 重写QLineEdit,实现编辑框内添加删除按钮的功能(随时把控件Move到一个地方,然后show就可以了,这是万能的办法)
http://www.qtcn.org/bbs/read-htm-tid-62265-ds-1-page-1.html#180286
- Windows下libevent C++封装类实现(为什么要使用封装好的网络库?)
题记 windows平台下对于服务器高并发的网络模型选型中,使用libevent是个不错的选择. 本文的背景基于:国内博客对于libevent大多介绍linux实现,大多是c语言的实现,Windows ...
- 获取其他进程的命令行(ReadProcessMemory其它进程的PPROCESS_PARAMETERS和PEB结构体)
type UNICODE_STRING = packed record Length: Word; MaximumLength: Word; Buffer: PWideCh ...
- 玩转Java多线程(乒乓球比赛)
转载请标明博客的地址 本人博客和github账号,如果对你有帮助请在本人github项目AioSocket上点个star,激励作者对社区贡献 个人博客:https://www.cnblogs.com/ ...
- 阿里云主机CentOS7设置远程连接MySQL数据库
有一个困扰了我好久的问题,今天终于解决了. 看网上的答案只有一部分.今天把完整的发篇博客纪念一下下. 首先,连接阿里云主机并登录数据库, 1.添加一个Host mysql>select User ...
- 搭建Elk集群搭建 ES-filebeat-logstrash-kibana
一 .基础环境 软件 版本 作用 Linux/Win Server2012 CentOs/Win Server2012 服务器环境 JDK 1.8.0_151 运行环境依赖 Elasticsearch ...
- 【STL】集合运算
STL中有可以实现交集.并集.差集.对称差集的算法. 使用前需要包含头文件: #include <algorithm> 注:使用计算交集和并集的算法必须保证参与运算的两个集合有序!!! 交 ...
- Java学习笔记——三层架构
Layer: UI层: user interface 用户接口层 Biz层: service business login layer 业务逻辑层 DAO层: Date Access Obje ...