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

    摘自: http://www.oschina.net/code/snippet_347813_12525

    1. 代码: 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();
        }
    
    }

    2. 代码 : DynamicDataSource

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

    3.代码: 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>

    4. 代码: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();
            }
    
    
    
    
        }
    
    }
  • 相关阅读:
    tableau学习笔记—1
    sql学习笔记1
    rpy2的安装问题?【解决】
    python_广州房价热力图
    数据清洗记录——.图书馆学号去敏
    python argparse
    利用torch.nn实现前馈神经网络解决 多分类 任务
    R7000P Ubuntu20.04 安装 Realtek 8852 无线网卡驱动
    邻接矩阵的相乘的意义
    分类问题中评价指标
  • 原文地址:https://www.cnblogs.com/wuyifu/p/3745234.html
Copyright © 2011-2022 走看看