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(); 
        } 
 
    } 
 
}


原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/7985.html

(0)
上一篇 2021年7月18日
下一篇 2021年7月18日

相关推荐

发表回复

登录后才能评论