| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
n42g
10年前发布

spring+mybatis 多数据源切换

spring + mybatis 多数据源切换

DbContextHolder

public class DbContextHolder {      //线程安全的ThreadLocal      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();      }    }

DynamicDataSource

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;    public class DynamicDataSource extends AbstractRoutingDataSource {        @Override      public Object determineCurrentLookupKey() {          return  DbContextHolder.getDbType();      }    }

spring.xml

<!-- 数据源属性配置文件 -->      <context:property-placeholder location="classpath:ibatis.properties" />        <bean id="jksh" class="org.apache.commons.dbcp.BasicDataSource"          destroy-method="close">          <!-- Connection Info -->          <property name="driverClassName" value="${driver.jksh}" />          <property name="url" value="${url.jksh}" />          <property name="username" value="${username.jksh}" />          <property name="password" value="${password.jksh}" />            <!-- Connection Pooling Info -->          <property name="maxIdle" value="${maxIdle.jksh}" />          <property name="maxActive" value="${maxActive.jksh}" />          <property name="defaultAutoCommit" value="false" />          <property name="timeBetweenEvictionRunsMillis"              value="${timeBetweenEvictionRunsMillis.jksh}" />          <property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis.jksh}" />      </bean>        <bean id="jclt" class="org.apache.commons.dbcp.BasicDataSource"          destroy-method="close">          <!-- Connection Info -->          <property name="driverClassName" value="${driver.jclt}" />          <property name="url" value="${url.jclt}" />          <property name="username" value="${username.jclt}" />          <property name="password" value="${password.jclt}" />            <!-- Connection Pooling Info -->          <property name="maxIdle" value="${maxIdle.jclt}" />          <property name="maxActive" value="${maxActive.jclt}" />          <property name="defaultAutoCommit" value="false" />          <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis.jclt}" />          <property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis.jclt}" />      </bean>        <bean id="dataSource" class="com.jclt.service.commons.DynamicDataSource">          <property name="targetDataSources">              <map key-type="java.lang.String">                  <entry key="jksh" value-ref="jksh" />                  <entry key="jclt" value-ref="jclt" />              </map>          </property>          <property name="defaultTargetDataSource" ref="jksh" />      </bean>

main方法

import javax.sql.DataSource;    import org.springframework.context.ApplicationContext;  import org.springframework.context.support.ClassPathXmlApplicationContext;   import org.springframework.core.io.FileSystemResource;  import org.springframework.core.io.Resource;    import com.jclt.service.commons.DbContextHolder;  import com.jclt.service.model.User;    import org.apache.ibatis.session.SqlSession;  import org.apache.ibatis.session.SqlSessionFactory;  import org.mybatis.spring.SqlSessionFactoryBean;    public class Text {        /**       * @param args       */      public static void main(String[] args) {          ApplicationContext appContext = new ClassPathXmlApplicationContext("client-beans.xml");            DbContextHolder.setDbType("jclt");          String res="src/main/resources/ibatis-config.xml";          DataSource datasource=(DataSource) appContext.getBean("dataSource");            SqlSessionFactoryBean bean=new SqlSessionFactoryBean();          bean.setDataSource(datasource);          Resource resource=new FileSystemResource(res);          bean.setConfigLocation(resource);          try {              SqlSessionFactory sessionfactory = bean.getObject();              SqlSession session=sessionfactory.openSession();              User user=session.selectOne("com.jclt.service.Dao.readJKSH.findOne");              System.out.println(user.getName());          } catch (Exception e) {              e.printStackTrace();          }            DbContextHolder.setDbType("jksh");          String res1="src/main/resources/ibatis-config.xml";          DataSource datasource1=(DataSource) appContext.getBean("dataSource");            SqlSessionFactoryBean bean1=new SqlSessionFactoryBean();          bean1.setDataSource(datasource1);          Resource resource1=new FileSystemResource(res1);          bean1.setConfigLocation(resource1);            try {              SqlSessionFactory sessionfactory = bean.getObject();              SqlSession session=sessionfactory.openSession();              User user=session.selectOne("com.jclt.service.Dao.readJKSH.findOne");              System.out.println(user.getName());          } catch (Exception e) {              e.printStackTrace();          }        }    }