SpringMVC Mybatis配置多个数据源并切换代码详解
这篇文章主要介绍了SpringMVCMybatis配置多个数据源并切换代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
最近公司一个项目需要连接两个数据库(A和B)操作,有的模块查询A库,有的模块查询B库,因此需要改造下,项目后台用的是SpringMVC+Mybatis+MySQL架构,折腾了两天后终于搞定了,在这里记录过改造过程。
使用场景
多数据源的使用的场景一般有:
- 主从数据库切换
- 读写分离
- 兼容旧库
实现原理
Spring2.x的版本中采用Proxy模式,就是在方案中实现一个虚拟的数据源,并且用它来封装数据源选择逻辑,这样就可以有效地将数据源选择逻辑从Client中分离出来。Client提供选择所需的上下文,由虚拟的DynamicDataSource根据Client提供的上下文来实现数据源的选择。
具体的实现是虚拟的DynamicDataSource仅需继承AbstractRoutingDataSource实现determineCurrentLookupKey(),该方法返回需要使用的DataSource的key值,然后根据这个key从resolvedDataSources这个map里取出对应的DataSource,如果找不到则用默认的resolvedDefaultDataSource。
详细实现过程
修改spring的配置文件
配置文件里需要配置多个数据源,改造后主要配置如下:
classpath*:com/test/**/*Mapper.xml
添加动态数据源管理类
DynamicDataSource类继承AbstractRoutingDataSource,实现determineCurrentLookupKey()方法。
packagecom.test.util; importcom.test.util.CustomerContextHolder; importorg.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; /** *动态数据源管理类 * */ publicclassDynamicDataSourceextendsAbstractRoutingDataSource{ @Override protectedObjectdetermineCurrentLookupKey(){ returnCustomerContextHolder.getCustomerType(); } }
数据源切换类
CustomerContextHolder类可以实现数据源A和B的切换,数据源标识保存在线程变量中,避免多线程操作数据源时互相干扰
packagecom.test.util; /** *数据源切换类 * */ publicclassCustomerContextHolder{ publicstaticfinalStringDATA_SOURCE_DEFAULT="dataSourceTargetA"; publicstaticfinalStringDATA_SOURCE_B="dataSourceTargetB"; privatestaticfinalThreadLocalcontextHolder=newThreadLocal (); publicstaticvoidsetCustomerType(StringcustomerType){ contextHolder.set(customerType); } publicstaticStringgetCustomerType(){ returncontextHolder.get(); } publicstaticvoidclearCustomerType(){ contextHolder.remove(); } }
使用多数据源代码
下面是Controller层代码,需要查询B数据源,查询完成后切换为默认数据源A,具体代码如下:
/** *订单列表查询,查询B数据源 * *@paramrequest *@return */ @RequestMapping(value="/list") publicStringlist(HttpServletRequestrequest,IntegercId){ //设置数据源B CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_B); ListorderList=salaryBillService.getSalaryOrderByOrgId(cId); request.setAttribute("orderList",orderList); //切换回默认数据源A CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_DEFAULT); return"/jsp/order"; }
上述四步操作完成后即可实现SpringMVC+Mybatis配置多个数据源并切换,有问题欢迎留言沟通哦!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。