随着SAAS平台越来越盛行,很多情况下,希望应用程序搭建一套,为每个用户建立一个私有的数据库,所有程序使用一套.
开动吧:
一、 首先继承AbstractRoutingDataSource,从名称上看为抽象路由数据源,就是spring为提供动态数据库而设定的。在这个类中,需要重写determineCurrentLookupKey这个方法,这个方法就是动态从
private Map<Object, Object> targetDataSources(AbstractRoutingDataSource类里面的属性)里面获取对应的数据源
二、新建DataSourceHolder:
三、在controller层的每个方法前切换数据源,用到AOP
重点说明:每多人会有疑问,springcloud的controller是单例,这样在多用户的情况下,会不会窜请求,线程不安全
原因解答:(1)请看上面,其实我们使用了ThreadLocal,如果不理解的,请去补ThreadLocal知识了
用多线程测试:我用多个线程,调用同一个查询方法,但每个请求的header中的dsNo都不一样,这样就真实模拟生产环境,多用户查的情况,看是否有有窜请求,线程不安全的情况,实际测试并没有这种情况出现
(1)AOP动态切换数据库:
(2)测试代码
四、相信很多人都希望要本项目代码,本项目githup地址
测试说明:按本项目测试,需要创建4个数据库ds01、ds02、ds03、ds04,sql语句在sql.sql中,里面表都一样,只是数据不一样,比如ds01库表中的记录reason写dso1,ds02数据库中表的记录写ds02,ds03数据库中表的记录写ds03,ds04数据库中表的记录写ds04,以此类推,自己修改数据...,通过查询传不同的数据库编号,返回的不同数据,来辨别是否切换到了对应的数据库
如下图(如有什么不对的对方,可以加Q群 147960493,联系群主我)
补充信息:
在实际项目中如何应用,提示一下大家,1、首先得有一个公共全局数据库,如all_database_url,这里面存所有数据源的jdbc url地址,以及连对应数据库的用户名及密码。2、修改DynamicDataSource 中的DynamicDataSource()方法从all_database_url库中取出所有数据库的jdbc url信息,进行初始化。3、DynamicDataSource()方法从all_database_url库中取出所有数据库的jdbc url信息,怎么取?自己写原生代码查询数据all_database_url,不能用框架了,原因是框架连数据库,给ds01,ds02,ds03这些具体数据库用了。