MyBatis 多数据源配置
来源:互联网 发布:java web在线音乐网站 编辑:程序博客网 时间:2024/05/01 12:27
关于 Spring+MyBatis框架的配置这里我就不说了,不会的同学在网上搜搜, 这篇文章主要讲 多数据源的配置我的项目环境是 spring4.3.3.RELEASE
<!-- mybatis核心包 --><dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.6</version></dependency><!-- mybatis/spring包 --><dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version></dependency>
网上关于多数据源配置有很多方法,我在里面挑了一个最简单,最实用的一种,核心原理也就一句话 写一个DynamicDataSource类来继承AbstractRoutingDataSource,并重写determineCurrentLookupKey()方法,来达到动态切换数据库
1): DynamicDataSource
import java.util.logging.Logger;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;/** * 动态切换数据库 * * @author wangjianghai (johnny_hzz@qq.com) * @date 2016年11月30日 上午9:40:53 * @Description: 继承AbstractRoutingDataSource,并重写determineCurrentLookupKey()方法 */public class DynamicDataSource extends AbstractRoutingDataSource { @Override public Logger getParentLogger() { return null; } @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDbType(); }}
重写 determineCurrentLookupKey 方法,DataSourceContextHolder.getDbType()这个框架在查询数据的时候获取数据源信息,看下面
2) : DataSourceContextHolder
import com.lb.utils.StringUtil;/** * 数据库切换的工具类 * * @author wangjianghai (johnny_hzz@qq.com) * @date 2016年11月30日 上午9:30:06 * @Description: 注意java.lang.ThreadLocal 的使用 */public class DataSourceContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setDbType(String dbType) { contextHolder.set(dbType); } public static String getDbType() { //先判断程序中有没有设置数据源,如果没有 就选择默认的一个 String db =((String) contextHolder.get()); if(StringUtil.isEmpty(db)){ setDbType(DataSourceType.SOURCE_ONE); db =((String) contextHolder.get()); } return db; } public static void clearDbType() { contextHolder.remove(); }}
StringUtil.isEmpty(db)这判断是判断 db 这个字符串是否是 null or “”,
3) : DataSourceType 这个类可有可无
/** * 数据库类型常量类 * * @author wangjianghai (johnny_hzz@qq.com) * @date 2016年11月30日 下午1:57:05 * @Description: */public class DataSourceType { public static final String SOURCE_ONE= "db1"; public static final String SOURCE_TWO = "db2"; public static final String SOURCE_ORACLE = "db_oracle";}
4) : 接下来就是 spring-mybatis.xml 的配置了,这里我只给出 多数据源的配置,
<bean id="db1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass --> <property name="driverClassName" value="${db.driver}" /> <!-- 基本属性 url、user、password --> <property name="url" value="${db.url}" /> <property name="username" value="${db.username}" /> <property name="password" value="${db.password}" /> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="1" /> <property name="minIdle" value="1" /> <property name="maxActive" value="20" /> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> <!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计 --> <property name="filters" value="stat" /> </bean> <bean id="db2" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass --> <property name="driverClassName" value="${db.driver2}" /> <!-- 基本属性 url、user、password --> <property name="url" value="${db.url2}" /> <property name="username" value="${db.username2}" /> <property name="password" value="${db.password2}" />......此处省略 </bean> <bean id="db_oracle" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass --> <property name="driverClassName" value="${db.driver3}" /> <!-- 基本属性 url、user、password --> <property name="url" value="${db.url3}" /> <property name="username" value="${db.username3}" /> <property name="password" value="${db.password3}" />......此处省略 </bean>
这里我配置了三个数据源 , 前两个是 mysql,最后一个是oracle 注意oracle 在配置的时候<property name="validationQuery" value="SELECT 'x' FROM DUAL" />
然后就是 数据源管理配置
<!-- 动态配置数据源 --> <bean id ="dataSource" class= "xxx.xxx.xxx.DynamicDataSource" > <property name ="targetDataSources"> <map key-type ="java.lang.String"> <!-- key: 在代码中切换数据源所使用的key. value-ref 为xml中数据源的配置 id --> <entry value-ref ="db1" key= "db1"></entry > <entry value-ref ="db2" key="db2"></entry> <entry value-ref ="db_oracle" key="db_oracle"></entry> </map > </property > </bean >
然后就是数据源工厂的配置,这里就不给出代码了,
5) 我是在业务层切换数据源的
/** * 第三个数据源的数据 */ public DbTest search(DbTest bean) throws Exception { // 第三个数据源的数据 DataSourceContextHolder.setDbType(DataSourceType.SOURCE_ORACLE); bean = dbTestDao.search(bean); return bean; }
然后把项目跑起来 ,测试代码大家就自己写吧,可以写 jsp 页面,也可以用 Junit 测试,下面是我的测试结果
1 0
- mybatis多数据源配置
- mybatis配置多数据源
- MyBatis 多数据源配置
- mybatis 多数据源配置
- mybatis多数据源配置
- MyBatis多数据源配置
- spring + mybatis多数据源配置
- spring MVC+MyBatis 多数据源配置
- Spring下mybatis 多数据源配置
- springmvc mybatis多数据源配置
- Spring下mybatis配置多数据源
- Spring+Mybatis 多数据源配置
- MyBatis多数据源配置(读写分离)
- Spring+MyBatis多数据源配置实现
- spring+mybatis多数据源配置
- SpringMvc+Mybatis多数据源配置
- Spring+MyBatis多数据源配置实现
- Spring+Mybatis配置多数据源
- Java并发编程-总结
- 理解互斥量和信号量
- cocos2d-x架构和目录结构(摘自官方文档)
- Qt保留小数点后两位
- Maven 编译后 内存中中文数据乱码
- MyBatis 多数据源配置
- scala 定义字符串
- Web.config配置文件详解(新手必看)
- 算法概论8.15题解
- 设置系统返回按钮背景图片
- Java中 equals() 和 == 的区别
- USB检测
- android与HTML5相结合实现的省市县三级联动
- Java中遍历Map