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的数据库 ...
随机推荐
- Windows下配置Redis,并修改密码
原文:Windows下配置Redis,并修改密码 Windows下配置Redis,并修改密码 下载 Redis Windows版本的GitHub链接,直接下载zip文件解压到指定文件夹下或者下载msi ...
- Java8 的一些新特性总结
目前Java8已经发布很多个版本了,对于Java8中的新特性虽然有各位大神进行jdk8的英文特性文档翻译,但都太官方化语言,对照几篇翻译本人对新特性文档做一下总结,以帮助我和各位不了解Java8新特性 ...
- UWP-电子音读出文字
原文:UWP-电子音读出文字 源码: https://github.com/lindexi/Markdown 代码 private async void speech(string str, Medi ...
- Add-AppxProvisionedPackage
原文: Add-AppxProvisionedPackage Adds an app package (.appx) that will install for each new user to a ...
- 核心思想:许多公司都没有认识到云储存的革命性(类似QQ把它搞成了用户的家、再也离不开了)
在云储存刚刚兴起的时候,也就是dropbox刚刚进入大家视野的时候.许多人都是简单的认为这只是一个提供在线存储的服务而已,许多公司都没有认识到云储存的革命性. 对于这些大公司贸然进入一些新的领域是需要 ...
- Android零基础入门第70节:ViewPager轻松完成TabHost效果
上一期学习了ViewPager的简单使用,本期一起来学习ViewPager的更多用法. 相信很多同学都使用过今日头条APP吧,一打开主界面就可以看到顶部有很多Tab,然后通过左右滑动来切换,就可以通过 ...
- QT中的各种对话框
大家可以参见QT中各种MessageBox的使用的这篇文章 界面效果图如下,大家可以用代码自己操作 diglog.h #ifndef DIALOG_H #define DIALOG_H #includ ...
- 为QNetworkAccessManager添加超时提醒(自己记录一段时间里的下载字节数,用定时器去定期检测,从而判断是否超时)
在做更新,在测试异常的时候,在下载过程中,发现如果直接系统禁用了网络,会报错误,可以捕获.但是如果是第三方软件限制程序联网,问题来了. 程序会一直在那里等待,没有异常,也不发送QNetworkAcce ...
- Awesome C/C++(图像部分)
GUI Graphic User Interface CEGUI - Flexible, cross-platform GUI library. FLTK - Fast, light, cross-p ...
- spring之@Value详解(转载)
@Value注入 不通过配置文件的注入属性的情况 通过@Value将外部的值动态注入到Bean中,使用的情况有: 注入普通字符串 注入操作系统属性 注入表达式结果 注入其他Bean属性:注入beanI ...