最近公司一个项目需要连接多个数据库(A和B)操作,根据不同的业务模块查询不同的数据库,因此需要改造下之前的spring-mybatis.xml配置文件以及jdbc.properties配置文件,项目后台用的是SpringMVC+Mybatis+MySQL架构,折腾了一两天算是搞定了,在这里记录过改造过程。
使用场景
多数据源的使用的场景一般有:
- 主从数据库切换
- 读写分离
- 兼容旧库
实现原理
Spring2.x的版本中采用Proxy模式,就是在方案中实现一个虚拟的数据源,并且用它来封装数据源选择逻辑,这样就可以有效地将数据源选择逻辑从Client中分离出来。Client提供选择所需的上下文,由虚拟的DynamicDataSource根据Client提供的上下文来实现数据源的选择。
具体的实现是虚拟的DynamicDataSource仅需继承AbstractRoutingDataSource实现determineCurrentLookupKey(),该方法返回需要使用的DataSource的key值,然后根据这个key从resolvedDataSources这个map里取出对应的DataSource,如果找不到则用默认的resolvedDefaultDataSource。
详细实现过程
1:修改jdbc.properties的配置文件
#A 数据源A库
jdbc.a.driverClassName=com.mysql.jdbc.Driver
jdbc.a.url=jdbc:mysql://localhost:3306/exam_zhaosq?useUnicode=true&characterEncoding=utf-8
jdbc.a.username=root
jdbc.a.password=root
#B 数据源B库
jdbc.b.driverClassName=com.mysql.jdbc.Driver
jdbc.b.url=jdbc:mysql://localhost:3306/myshop?useUnicode=true&characterEncoding=utf-8
jdbc.b.username=root
jdbc.b.password=root
2:修改spring-mybatis.xml的配置文件 配置文件里需要配置多个数据源,改造后主要配置如
2.添加动态数据源管理类
DynamicDataSource类继承AbstractRoutingDataSource,实现determineCurrentLookupKey()方法。
3. 数据源切换类
CustomerContextHolder类可以实现数据源A和B的切换,数据源标识保存在线程变量中,避免多线程操作数据源时互相干扰。
4. 使用多数据源代码
下面是Controller层代码,需要查询B数据源,查询完成后切换为默认数据源A,具体代码如下:
当进入customer方法的时候,会先从数据库B中的表进行查询数据,查询完成后,会切换到默认的数据库A,然后再从数据库A中的表查询数据,这样就达到了在一个Web项目中,根据不用的模块和业务需求,实现多个数据库存储数据和它们之间的切换了。
上述四步操作完成后即可实现SpringMVC+Mybatis配置多个数据源(库)并切换,有问题欢迎留言指教!