zoukankan      html  css  js  c++  java
  • 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();
            }
        }
     
    }

    本文转自:http://www.oschina.net/code/snippet_347813_12525

  • 相关阅读:
    函数式编程的基础
    monad
    Overview of Polymorphism -多态的分类
    浅谈Overload和Override的区别
    Polymorphism (computer science)
    Type inference
    Ad hoc polymorphism
    trait 和abstract的区别在哪里
    Type class-Typeclass-泛型基础上的二次抽象---随意多态
    泛型中的类型约束和类型推断
  • 原文地址:https://www.cnblogs.com/dreammyle/p/4412308.html
Copyright © 2011-2022 走看看