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的数据库 ...
随机推荐
- Central Subscriber Model Explained
原文 http://www.sqlrepl.com/sql-server/central-subscriber-model-explained/ The majority of SQL Server ...
- 快速写入Xml文件
我们在做一些操作的时候会需要生成日志,Xml文件就是我们常用的一种日志文件. 普通操作Xml文件的代码遇到大数据量的话就很慢了. 用这个生成Xml文件的话,即使数据量很大,也很快 private vo ...
- 队列读取器代理 遇到错误 Row handle is invalid
原文:队列读取器代理 遇到错误 Row handle is invalid 今天测试在发布中更改表名称,在发布数据库更改后重新发布这个表. 但是原来的表在订阅没有删除,不小心插入数据到原表中,队列读取 ...
- Android零基础入门第6节:配置优化SDK Manager,正式约会女神
原文:Android零基础入门第6节:配置优化SDK Manager,正式约会女神 在前几期中总结分享了Android的前世今生.Android 系统架构和应用组件那些事.带你一起来聊一聊Androi ...
- Android零基础入门第64节:揭开RecyclerView庐山真面目
原文:Android零基础入门第64节:揭开RecyclerView庐山真面目 大家还记得之前在第38期~第50期都在学习列表控件吗,其中用了8期讲ListView的使用,相信都已经掌握好了吧.那么本 ...
- Tensorflow进阶
第一章 图像领域,第\(i\)类图片提取到的特征: \[ feature_i=\sum_jw_{i,j}x_j+b_i \] 其中,\(j\)表示一张图片的第\(j\)个像素,\(b_i\)是偏置值( ...
- Android进程间通信-AIDL实现原理
Android进程间通信基于Proxy(代理)与Stub(桩或存根)的设计模式(如图1-1所示).其中,Proxy将特殊性接口转换成通用性接口,Stub将通用性接口转换成特殊性接口,二者之间的数据转换 ...
- TextBox的Enable和ReadOnly属性的限制
在以前的ASP.NET 1.x版本中,设置为ReadOnly的TextBox控件在客户端更改了值后,在服务器端仍然可以得到修改后的值,但在ASP.NET 2.0中,这种做法已经限制.这是为了提高应用程 ...
- happy machine learning(Second One)
发现机器学习就根本停不下来 今天来用RNN算法来爽爽僵尸网络宿主预测 首先我们下载好数据,然后打开我们可爱的熊猫 import numpy as np import pandas as pd impo ...
- java的equals与==的区别
看了网上关于equal与==的区别,感觉很多有些片面,不仔细,这里我来说说我对equal与==的理解 首先要了解基本类型与引用类型 1.int,char,boolean之类的就是基本类型,我们只要使用 ...