2 数据源配置_如何在程序运行中动态切换数据源?架构师必读秘笈

829a018e5afd8e28b907d9234de1392b.png

说起动态数据源,大家应该也不陌生。例如在读写分离系统中,则要对请求中的读写操作进行分离,让读和写落在不同的数据库上;例如在多租户系统中,则要根据请求来源租户的不同,让其落在不同租户的数据库上;例如在分库应用中,也要根据不同的规则让请求落在不同的数据库上。于是,我们的应用要根据请求的不同,操作不同的数据库,这时就需要动态数据源的帮助。

DynamicDataSource就是一个出色的动态数据源,他能让你在程序运行过程中动态增删和切换数据源。而且,它十分易用。使用它在一个请求中查询多个数据源变得无比简单。

56656255e8bf5cf6c7d79f60c75bd3d2.png

1 特点

DynamicDataSource具有以下特点:

  • 小巧:只实现最基本的数据源增删、切换功能,不涉及相关业务。
  • 易用:只需要简单的配置和几个方法的调用便可以完成所有功能。
  • 兼容:增加数据源时,数据源信息可以来自配置文件、前端界面输入、数据库查询等各种方式。
  • 无侵入:切换数据源操作可以由切面触发、逻辑触发、注解触发等,均可以供开发者自由实现。

DynamicDataSource中常用的方法有:

  • boolean addDataSource(DataSourceInfo dataSourceInfo, Boolean overwrite):增加一个数据源,overwrite用来决定如果已经存在同名数据源时是否要覆盖
  • boolean addAndSwitchDataSource(DataSourceInfo dataSourceInfo, Boolean overwrite):增加一个数据源并切换到该数据源,overwrite用来决定如果已经存在同名数据源时是否要覆盖
  • boolean switchDataSource(String dataSourceName):切换到指定名称的数据源
  • boolean delDataSource(String dataSourceName):删除一个数据源
  • void switchDefaultDataSource():切换到默认的数据源
  • DataSource getDefaultDataSource():获取默认数据源

以上方法都是多线程安全的。你可以在切面、操作逻辑、注解中调用以上方法,完成数据源的动态增删与切换。

2 快速上手

demo文件夹下提供一个示例项目,供大家快速上手。以该demo项目为例,我们介绍DynamicDataSource的使用。

2.1 引入依赖包

在POM文件中引入DynamicDataSource的jar包。

ee50448b2cbea11082aa198afff2e53c.png

2.2 基本配置

在application.properties文件中写入默认的数据源信息,下面为示例。可按照自己的数据源进行修改。

5f2f640b5e8aca8be5d49c990ec05b34.png

禁止Spring对DataSourceAutoConfiguration类的加载,否则该类会去加载固定的数据源。

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) 

增加对DynamicDataSource所在包的Bean的扫描。

@ComponentScan(basePackages = {"com.github.yeecode.dynamicdatasource","{other_package_root}"}) 

2.3 开始使用

至此,使用DynamicDataSource所需的全部配置就完成了。使用下面方式注入DynamicDataSource后便可以调用其中的数据源操作方法。

@Autowired 
private DynamicDataSource dynamicDataSource; 

我们可以按照demosqlDDL.md文件所述建立两个数据源,然后测试DynamicDataSource的工作情况。

启动DynamicDataSourceDemo项目得到如下界面。

2e3cc58502bbf84960932b445294c732.png

例如我们可以在一个接口内实现数据源的切换,从而在请求到达/接口时,先后查询了两个数据源中的数据,如代码所示。

2eeb2897f41461f4cdc8ead5564bc013.png

可以得到下图所示的结果。下图打印的两行语句分别来自两个数据源。

fcded07884d93a4e1958ebf3fa4e8e8e.png

数据源新增、删除、切换操作可以在切面中、业务逻辑中、注解中等各处进行触发。DynamicDataSource不做任何限制,交由开发人员按照实际需要实现。

3 总结

怎么样,DynamicDataSource的使用是不是非常简单。通过Maven仓库直接下载依赖,并且还有Demo项目指导,瞬间上手。

从此,动态数据源的切换So Easy!

实属架构师、程序员秘笈,收藏起来,日后用。其具体接口可能在日后升级中变动,请以最新版本的README文档为准。项目地址如下:

https://github.com/yeecode/DynamicDataSource​github.com

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

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

相关文章

数字滚动_告别单调!让PPT数字滚动起来。

大家好,我是三石。在PPT的制作过程中,数字是不可缺少的元素。如何设计制作,才能使简单的数字变得有活力。废话不多说看效果~其实制作方式很简单,跟着我的步骤你也能做出来。制作步骤:1、首先要制作出数字条可以通过Exc…

mysql字段是否存在_mysql判断列是否存在

本篇文章将通过存储过程来判断列(字段)是否存在。请看详情。推荐课程:MySQL教程。判断字段是否存在:DROP PROCEDURE IF EXISTS schema_change;DELIMITER //CREATE PROCEDURE schema_change() BEGINDECLARE CurrentDatabase VARCHAR(100);SELECT DATABASE…

mysql 日期间隔_mysql比较两个日期间隔

一、两个日期间隔天数,使用datediff()函数例:mysql> select datediff(now(),20160401);----------------------------| datediff(now(),20160401) |----------------------------| 4 |----------------------------1 row in…

ubuntu apache2 mysql_折腾 Ubuntu 系统续之安装PHP、Apache2和Mysql

一个狗血的开始接上回的折腾,话说昨天晚上狗屎运来临,在重装了一次的 Ubuntu 系统上,居然顺利的安装了 QQ、PHP7、Apache2、phpMyAdmin、chrome stable、Sublime Text3 并注册成功、git,还有其他桌面美化的东西,如 Doc…

mysql 5.7 数据库备份_MySQL5.7.20数据库备份与恢复

MySQL数据库备份与恢复####造成数据丢失的原因####程序错误人为操作错误运算错误磁盘故障灾难(如火灾、地震)和盗窃####物理与逻辑的角度####1、物理备份:冷备份:在数据关闭的状态下运行热备份:在数据库运行的状态时进行备份操作,…

mysql warning 日志_Mysql5.7.19安装后错误日志中有警告

警告1:secure_file_priv 配置项对数据导入导出的影响1、限制mysqld 不允许导入 | 导出mysqld --secure_file_privenullMySQL [ztjy]> select * from info_posts limit 10 into outfile /usr/local/src/info_posts_tmp.txt;ERROR 1290 (HY000): The MySQL server …

fscanf不读取_思考了一天,终于把matlab的fscanf中的sizeA搞清楚了

数值如12345等可以作为字符,所以以字符格式读取文件时,这些数字照样可以被读取 A fscanf(fileID,formatSpec) A fscanf(fileID,formatSpec,sizeA) 以上是fscanf的语法; sizeA起到的作用是限制,限制读取读取文件中数据的数量&…

linux开发板 pc 通讯_从51单片机到Linux 开发板运行hello world(教程4)

大家好,我是兔子。是一个嵌入式软硬件工程师。正在从单片机开发转岗Linux开发。这次教大家如何在Linux开发板上运行可执行文件。简单起见,不涉及到硬件。直接和教程2一样,能在PC虚拟机上运行hello world程序。当然开发板上也可以。1.Source I…

python decimal 转 float_python教程之二python数学运算

存储数据变量#两个变量交换值,通过第三个参数实现print(两个变量交换值,通过第三个参数实现); #第一种方法是通过第三个参数实现x5;#变量赋值y11; #变量赋值print(交换前,x,y);tempx;xy;ytemp;print(交换后,x,y);#两个变量交换值,更便捷的方法…

mysql 视图 动态sql_sql-server – 使用动态Sql创建视图

我正在尝试创建一个动态数据库创建脚本.有很多步骤,我们经常创建这个数据库,所以脚本看起来像这样.DECLARE databaseName nvarchar(100) DatabaseNameEXEC(/*A lot of database creation code built off of databaseName*/)除了我们在此数据库中创建的一个视图外,这一切都很好…

apache arm 交叉编译_移植apache2 ARM版 – 交叉编译apache2 | 学步园

下载apache2 http://apache.fayea.com/apache-mirror//httpd/httpd-2.4.6.tar.bz21. tar jxvf httpd-2.4.6.tar.bz22. cd httpd-2.4.63. ./configure --hostarm-linux --prefix/usr/local/arm/4.4.3 --with-apu/usr/local/arm/4.4.3/ --with-apr-util/usr/local/arm/4.4.3 --wi…

mysql订单表上亿怎么分表_[转]单表上亿的数据量如何分表

之前的几篇关于分表的,提到的分表策略不够详细,我在这篇中补充一些分表策略吧:按号段分:(1) user_id为区分,1~1000的对应table1,1001~2000的对应table2,以此类推&#xf…

mysql msdtc 不支持_IIS5.1安装后,不支持IIS的问题。(转)

(如果是ghost版本安装的xp或者win2003无法安装iis,那么你只需要下载本站从WINDOWS安装盘抽取的IIS安装文件,就可以安装IIS了,WINXPSP1 安装IIS 5, WINXP SP2 IIS5.1 ,WIN2003安装IIS6,特别提示下菜鸟同志&a…

python中对象包含几个部分_python中包含对象类型的两个列表的交集

如果顺序无关紧要,请使用set.intersection:A [(1.1,2.2),(3.3,4.4),(5.5,6.6)]B [(1.1,2.2),(7.7,8.8),(3.3,4.4)]print(set(A).intersection(B))set([(3.3, 4.4), (1.1, 2.2)])或者将B设为集合,并在a上迭代保持公共元素:^{pr2}…

mysql 不会联想字段_你有没有被MySQL的这个bug坑过?

问题描述近期,线上有个重要Mysql客户的表在从5.6升级到5.7后,master上插入过程中出现"Duplicate key"的错误,而且是在主备及RO实例上都出现。以其中一个表为例,迁移前通过“show create table” 命令查看的auto increme…

mysql新增后默认返回值_mybatis insert、update 、delete默认返回值解释与如何设置返回表主键...

在使用mybatis做持久层时,insert、update、delete,sql语句默认是不返回被操作记录主键的,而是返回被操作记录条数;那么如果想要得到被操作记录的主键,可以通过下面的配置方式获取。针对Sequence主键而言,在…

mysql 主从 sql线程no_Mysql 主从同步 slave_sql_running 为no

背景之前搭建了主从,但没有设置读写分离,从库也能写数据。于是想测试下在从库写数据会导致同步怎么样。 结果发现,slave_sql_running为no,slava_IO_running仍然为yes.原因由于从库写数据,导致主从数据不一致&#xff0…

header python 环境信息_【关于header信息的构造】Python模拟登录出现乱码

使用Python模拟登录Z-Blog系统的后台时,如果构造的header信息如下,那么得到的结果将会乱码,如下图所示对应的错误的header信息如下:url "http://192.168.1.11/cmd.asp?actverify"request urllib2.Request(url)reques…

mysql 组内排序_mysql组内排序取最大值

最近业务反馈一个查询异常的问题,需要DBA对查询结果异常给出解释,并帮助他们解决该问题。问题本质是一个组内排序取最大值的问题,根据业务需求,我构建了测试用例测试用例--建表create table testorder(id int not null,no int not…

mysql索引抽密度_使用python脚本从abaqus输出数据库获取元素密度

属性关联如下:sectionAssignment将section连接到setset是{}的容器section将sectionAssignment连接到materialinstance连接到{}(可以来自另一个模型的部件)part连接到modelmodel连接到section如果可以,请使用.inp或.cae文件。下面的代码从一个打开的cae文…