spring+mybatis多数据源切换
2015-10-22 19:47
561 查看
在实际的公司项目中,很可能会遇到一个问题就是,一个java项目,但是项目中涉及两个数据库,这两个数据库还在不同IP的机子上。
遇到这种情况的时候,我们有两个选择
1、不走spring的aop方式,直接去多做两个dataSource
2、用spring进行管理,灵活地进行数据源切换
现在就来对第2种方式进行笔记:
spring.xml配置文件:
具体实现切换的操作类:
弄完以上的事情,剩下的事情就简单了
-》先是加载spring.xml文件applicationContext = new ClassPathXmlApplicationContext("spring.xml");
-》然后设置数据源DataSourceContextHolder.setDbType("db1");
-》接着从applicationContext 中获取sqlSession = (SqlSession) applicationContext.getBean("sqlSession");
-》最后就可以拿这个sqlSession去做增删改查的操作
注意:不用对这个sqlSession做close和comit的操作,因为都已经由spring自己管理了,不用手动做这些操作。
遇到这种情况的时候,我们有两个选择
1、不走spring的aop方式,直接去多做两个dataSource
2、用spring进行管理,灵活地进行数据源切换
现在就来对第2种方式进行笔记:
spring.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <!--配置mysql数据库参数 --> <context:property-placeholder location="mysql.properties" /> <!--多个数据源配置 --> <bean id="db1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <!-- 连接数据库参数 --> <property name="driverClassName" value="${db1.driver}" /> <property name="url" value="${db1.url}" /> <property name="username" value="${db1.username}" /> <property name="password" value="${db1.password}" /> <!--连接池参数 --> <property name="initialSize" value="10" /> <property name="maxActive" value="500" /> <property name="maxIdle" value="40" /> <property name="minIdle" value="10" /> </bean> <bean id="db2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <!-- 连接数据库参数 --> <property name="driverClassName" value="${db2.driver}" /> <property name="url" value="${db2.url}" /> <property name="username" value="${db2.username}" /> <property name="password" value="${db2.password}" /> <!--连接池参数 --> <property name="initialSize" value="10" /> <property name="maxActive" value="500" /> <property name="maxIdle" value="40" /> <property name="minIdle" value="10" /> </bean> <bean id="dataSource" class="com.ckd.datasource.mybatis.DynamicDataSource"> <property name="targetDataSources"> <map key-type="java.lang.String"> <entry key="db1" value-ref="db1" /> <entry key="db2" value-ref="db2" /> </map> </property> <property name="defaultTargetDataSource" ref="db2" /> </bean> <!-- mybatis配置 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" /> <property name="mapperLocations" value="classpath:mybatis/mapper/*.xml"/> </bean> <!--获取sqlSession--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0"> <ref bean="sqlSessionFactory"/> </constructor-arg> </bean> <!-- 事务管理器配置,单数据源事务 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> </beans>
具体实现切换的操作类:
/** * @fileName DynamicDataSource.java * @author chenkaideng * @date 2015年8月27日 * @describe 动态获取数据源 */ public class DynamicDataSource extends AbstractRoutingDataSource{ @Override protected Object determineCurrentLookupKey() { // TODO Auto-generated method stub return DataSourceContextHolder.getDbType(); } }
/** * @fileName DataSourceContextHolder.java * @author chenkaideng * @date 2015年8月27日 * @describe 数据源设值Holder类 */ 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() { return ((String) contextHolder.get()); } public static void clearDbType() { contextHolder.remove(); } }
弄完以上的事情,剩下的事情就简单了
-》先是加载spring.xml文件applicationContext = new ClassPathXmlApplicationContext("spring.xml");
-》然后设置数据源DataSourceContextHolder.setDbType("db1");
-》接着从applicationContext 中获取sqlSession = (SqlSession) applicationContext.getBean("sqlSession");
-》最后就可以拿这个sqlSession去做增删改查的操作
注意:不用对这个sqlSession做close和comit的操作,因为都已经由spring自己管理了,不用手动做这些操作。
相关文章推荐
- 为什么Java不支持多继承?
- Java 7的并发编程-Phaser
- spring的placeholder配置
- Spark启动错误Exception in thread “main” java.lang.NoSuchMethodError: scala.collection.immutable.HashSet$
- Ubuntu14.04 安装jdk
- jdk7的新特性
- 使用Spring容器取出Bean时的奇怪的ClassCastException
- 图灵机器人(智能云交互API)的一个java实现简单例子
- 插入排序之直接插入排序算法-java实现
- Java8 特性
- map集合类迭代方法
- 如何两个栈实现队列?两个队列实现栈?
- spring中bean的加载1
- java二叉树的遍历算法
- Java 正则表达式
- Java:Stackoverflow上人气最旺的10个Java问题
- Spring 将properties文件转为系统工具类
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Ford-Fulkerson算法 java实现
- Java集合类详解之例子