• 技术文章 >Java >java教程

    Spring与Mybatis相结合实现多数据源切换功能

    高洛峰高洛峰2017-01-24 10:17:27原创704
    废话不多说,关键代码如下所示:

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

    以上所述是小编给大家介绍的Spring与Mybatis相结合实现多数据源切换功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对PHP中文网的支持!

    更多Spring与Mybatis相结合实现多数据源切换功能相关文章请关注PHP中文网!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:Spring 实现数据库读写分离的示例 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • Java数据结构之单链表与OJ题• 一起来分析java设计模式之单例• 详细介绍Java正则表达式之单字符匹配和预定义字符• 一文搞懂Java线程池实现原理• Java总结分享之反射、枚举、Lambda表达式
    1/1

    PHP中文网