mybatis动态切换数据源
(#)背景:由于业务的需求,导致需要随时切换15个数据源,此时不能low逼的去写十几个mapper,所以想到了实现一个数据源的动态切换
首先要想重写多数据源,那么你应该理解数据源的一个概念是什么,DataSourceTransactionManager这个类就是spring中对于数据源的封装,其中DataSource做为
他的一个成员.接下来我们要介绍一下我们切换动态数据源需要使用的类,AbstractRoutingDataSource,先来看看这个类的源码

首先看看这几个变量,targetDataSources代表的就是备选的数据源了,用一个map存储,显然是为了在关键的时候快速的查找这些数据源,defaultTargetDataSource
就是我们在配置的时候一般都会制定一个默认的数据源就是它了,
程序运行的时候在加载配置文件的时候,首先会执行setTargetDataSources方法,这个方法会加载配置文件中配置的数据源,存储在上面说的targetDataSource中,
然后是设置setDefaultTergetDataSource,这个就是上面说的默认的数据源,

接下来会执行这个方法,在其中会将所有的数据源用来初始化resolvedDataSources,而当实际上和数据库产生交互的时候那么会调用到下面的方法:


如果看到这里大概你也知道怎么回事了,在我们实际和数据库产生交互的时候那么就需要使用到数据源了,那么这个时候我们只是需要重写这determineCurrentLookupKey
方法,而用这个方法具体干了什么呢?就是用它来寻找数据源啊,也就是说我们在mapper中的配置:

(#)下面看看代码上怎么来写
首先为了线程安全我们使用一个ThreadLocal来做存储
public class ContextHolder {
public static final String DATASOURCE_1="dataSource";
public static final String DATASOURCE_2="dataSource2";
private static final ThreadLocal<String> context = new ThreadLocal<String>();
public static void setConsumerType(String consumerType){
context.set(consumerType);
}
public static String getConsumerType(){
return context.get();
}
public static void clearConsumerType(){
context.remove();
}
}
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return ContextHolder.getConsumerType();
}
}
其实剩下的怎么实现已经很简单了,基本思路就是使用一个动态代理,在执行这个方法的时候,我们动态的给ContextHoler设置值,我建议使用spring aop,或者如果
不是spring的项目,那么直接只用动态代理也是很好的我觉,下面贴出一些我的简陋的代码
@Aspect
@Component
public class DataSourceAspect { @Pointcut("execution(* com.wang.route.DynamicPersonService.*(..))")
public void pointCut() {
} @Before(value = "pointCut()")
public void before(JoinPoint joinPoint) { ContextHolder.setConsumerTyp(“”); }
}
mybatis动态切换数据源的更多相关文章
- 在使用 Spring Boot 和 MyBatis 动态切换数据源时遇到的问题以及解决方法
相关项目地址:https://github.com/helloworlde/SpringBoot-DynamicDataSource 1. org.apache.ibatis.binding.Bind ...
- Spring+Mybatis动态切换数据源
功能需求是公司要做一个大的运营平台: 1.运营平台有自身的数据库,维护用户.角色.菜单.部分以及权限等基本功能. 2.运营平台还需要提供其他不同服务(服务A,服务B)的后台运营,服务A.服务B的数据库 ...
- Spring + Mybatis 项目实现动态切换数据源
项目背景:项目开发中数据库使用了读写分离,所有查询语句走从库,除此之外走主库. 最简单的办法其实就是建两个包,把之前数据源那一套配置copy一份,指向另外的包,但是这样扩展很有限,所有采用下面的办法. ...
- springmvc+mybatis多数据源配置,AOP注解动态切换数据源
springmvc与springboot没多大区别,springboot一个jar包配置几乎包含了所有springmvc,也不需要繁琐的xml配置,springmvc需要配置多种jar包,需要繁琐的x ...
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源方法
一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...
- Spring动态切换数据源及事务
前段时间花了几天来解决公司框架ssm上事务问题.如果不动态切换数据源话,直接使用spring的事务配置,是完全没有问题的.由于框架用于各个项目的快速搭建,少去配置各个数据源配置xml文件等.采用了动态 ...
- AOP获取方法注解实现动态切换数据源
AOP获取方法注解实现动态切换数据源(以下方式尚未经过测试,仅提供思路) ------ 自定义一个用于切换数据源的注解: package com.xxx.annotation; import org. ...
- Spring Boot 如何动态切换数据源
本章是一个完整的 Spring Boot 动态数据源切换示例,例如主数据库使用 lionsea 从数据库 lionsea_slave1.lionsea_slave2.只需要在对应的代码上使用 Data ...
随机推荐
- ruby调试/练习时的小技巧
必备工具 irb 查祖先 1.9.3-p545 :023 > String.ancestors => [String, Comparable, Object, Kernel, BasicO ...
- Web 2D/3d
首选应该是H5,通过现成的js库来实现,兼容性应该不错 其次可以考虑使用Unity3d,开发起来应该比较快 搜集点资料先放起来~ Unity3d: http://unity3d.com/cn/get- ...
- photoshop学习入门:选择和处理
昨天花了一天时间看了李涛的视频<高手之路>入门的24集,累得连写工作日报的力气都没了,19点就睡.今天4点起来,补一下记录. photoshop是个位图处理工具(别的花里胡哨的功能忽略)— ...
- iis7 64位 操作excel的一系列问题(未完待续)
查了半天发现是IIS跑在64位环境下引起的.而64位下,是木有Access数据库的驱动的(包括Excel也不行). 解决办法是:在目标网站的应用程序池中选择高级设置,然后将启用32位应用程序设置为tr ...
- XAF 如何将数据库中Byte array图片显示出来
问题比较简单,直接上代码. private Image _Cover; [Size(SizeAttribute.Unlimited), ValueConverter(typeof(ImageValue ...
- 阿里云mariadb无法启动问题
需要再安装yum install mariadb-server就可以了, 重启服务器,使用命令 sudo systemctl start mariadb.service
- Weblogic的JDBC详解
WebLogic Server 中的JDBC概述 在 WebLogic Server 中,您可以配置数据库连接,方法是先配置 JDBC 数据源和多数据源,然后将这些 JDBC 资源指定到或部署到 W ...
- apache2.4配置Django1.7运行环境
系统环境Centos 6.5 这篇文章不适用6以下的系统,因为会碰到这个错误 [Mon Sep 22 18:13:02 2014] [error] [client 10.209.75.90] Trun ...
- Don't make a promise when you are in Joy. Don't reply when you are Sad.Don't take decisions when you are Angry.Think Twice.Act Wise.
Don't make a promise when you are in Joy. Don't reply when you are Sad.Don't take decisions when you ...
- Linux中tcpdump的编译和使用
tcpdump官网:http://www.tcpdump.org/ 转载于:http://www.cnblogs.com/hzl6255/p/6147985.html 目录 1. 介绍 2. 编译 2 ...