zoukankan      html  css  js  c++  java
  • spring+mybatis多数据源切换

    在实际的公司项目中,很可能会遇到一个问题就是,一个java项目,但是项目中涉及两个数据库,这两个数据库还在不同IP的机子上。

    遇到这种情况的时候,我们有两个选择
    1、不走spring的aop方式,直接去多做两个dataSource
    2、用spring进行管理,灵活地进行数据源切换
     
    现在就来对第2种方式进行笔记:
    spring.xml配置文件:
     1 <?xml version="1.0" encoding="UTF-8"?>  
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
     4 xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx"
     5 xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:context="http://www.springframework.org/schema/context"
     6 xsi:schemaLocation="
     7      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
     8      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     9      http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
    10      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    11  http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
    12      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">  
    13   
    14        <!--配置mysql数据库参数 -->
    15     <context:property-placeholder location="mysql.properties" />
    16     
    17     <!--多个数据源配置  -->
    18     <bean id="db1" class="org.apache.commons.dbcp.BasicDataSource"
    19         destroy-method="close">
    20         <!-- 连接数据库参数 -->
    21         <property name="driverClassName" value="${db1.driver}" />
    22         <property name="url" value="${db1.url}" />
    23         <property name="username" value="${db1.username}" />
    24         <property name="password" value="${db1.password}" />
    25      
    26       <!--连接池参数 -->
    27 <property name="initialSize" value="10" />
    28 <property name="maxActive" value="500" />
    29 <property name="maxIdle" value="40" />
    30 <property name="minIdle" value="10" />
    31     </bean>
    32     
    33     <bean id="db2" class="org.apache.commons.dbcp.BasicDataSource"
    34         destroy-method="close">
    35         <!-- 连接数据库参数 -->
    36         <property name="driverClassName" value="${db2.driver}" />
    37         <property name="url" value="${db2.url}" />
    38         <property name="username" value="${db2.username}" />
    39         <property name="password" value="${db2.password}" />
    40      
    41       <!--连接池参数 -->
    42 <property name="initialSize" value="10" />
    43 <property name="maxActive" value="500" />
    44 <property name="maxIdle" value="40" />
    45 <property name="minIdle" value="10" />
    46     </bean>
    47     
    48     <bean id="dataSource" class="com.ckd.datasource.mybatis.DynamicDataSource">
    49         <property name="targetDataSources">
    50             <map key-type="java.lang.String">
    51                 <entry key="db1" value-ref="db1" />
    52                 <entry key="db2" value-ref="db2" />
    53             </map>
    54         </property>
    55         <property name="defaultTargetDataSource" ref="db2" />
    56     </bean>
    57     
    58     <!-- mybatis配置 -->
    59        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    60 <property name="dataSource" ref="dataSource" />
    61 <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
    62 <property name="mapperLocations" value="classpath:mybatis/mapper/*.xml"/>
    63 </bean>
    64 <!--获取sqlSession-->
    65 <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    66 <constructor-arg index="0">
    67          <ref bean="sqlSessionFactory"/>
    68         </constructor-arg>
    69 </bean> 
    70 <!-- 事务管理器配置,单数据源事务 -->
    71 <bean id="transactionManager"
    72 class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    73 <property name="dataSource" ref="dataSource" />
    74 </bean>
    75      
    76 </beans>  

    具体实现切换的操作类:

     1 /**
     2  * @fileName DynamicDataSource.java
     3  * @author chenkaideng
     4  * @date 2015年8月27日
     5  * @describe 动态获取数据源
     6  */
     7 public class DynamicDataSource extends AbstractRoutingDataSource{
     8  @Override
     9  protected Object determineCurrentLookupKey() {
    10   // TODO Auto-generated method stub
    11   return DataSourceContextHolder.getDbType();
    12  }
    13 }
    /**
     * @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自己管理了,不用手动做这些操作。
  • 相关阅读:
    SDK Hello world(直接使用SDK封装)
    一个类有多个基类的内存布局
    写个测试程序看看磁盘映像文件中哪个扇区可以使用?
    在服务中以当前用户身份启动一个程序
    在类有成员变量的场景下, 按照虚表原理, 模拟虚函数实现
    pipe----管道
    Qt序列化格式分析(qint,QString)(非常简单好用)
    模拟QQ系统设置面板实现功能
    Qt持久性对象进行序列化(同时比较了MFC与Java的方法)
    使用srvany.exe将任何程序作为Windows服务运行
  • 原文地址:https://www.cnblogs.com/chenkaideng/p/4902592.html
Copyright © 2011-2022 走看看