zoukankan      html  css  js  c++  java
  • Spring+Mybatis多数据源配置

    一、配置文件

    properties

    ds1.driverClassName=com.mysql.jdbc.Driver  
    ds1.url=jdbc:mysql://192.168.200.130:3306/test1?useUnicode=true&characterEncoding=UTF-8
    ds1.username=hhh  
    ds1.password=123456  
      
    ds2.driverClassName=oracle.jdbc.OracleDriver  
    ds2.url=jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=UTF-8
    ds2.username=qqq 
    ds2.password=123456

    xml

       <bean id="dataSource" class="com.hhhqqq.datasource.DynamicDataSource">  
            <property name="targetDataSources">  
                <map key-type="java.lang.String">  
                    <entry key="ds1" value-ref="ds1" />  
                    <entry key="ds2" value-ref="ds2" />  
                </map>  
            </property>  
            <property name="defaultTargetDataSource" ref="ds1" />  
        </bean>  
          
        <bean id="ds1" class="com.alibaba.druid.pool.DruidDataSource"  
            destroy-method="close">  
            <property name="driverClassName" value="${ds1.driverClassName}" />  
            <property name="url" value="${ds1.url}" />  
            <property name="username" value="${ds1.username}" />  
            <property name="password" value="${ds1.password}" />  
        </bean>  
    <bean id="ds2" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="driverClassName" value="${ds2.driverClassName}" /> <property name="url" value="${ds2.url}" /> <property name="username" value="${ds2.username}" /> <property name="password" value="${ds2.password}" /> </bean>

    二、Java文件

    com.hhhqqq.datasource.DynamicDataSource源码

    import java.util.logging.Logger;
    import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
    public class DynamicDataSource extends AbstractRoutingDataSource { /** * 取得当前使用那个数据源。 */ @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDbType(); } public Logger getParentLogger() { // TODO Auto-generated method stub return null; } }

    DataSourceContextHolder源码

    public class DataSourceContextHolder {
        private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();  
        
        /** 
         * 设置当前数据库。 
         * @param dbType 
         */  
        public static void setDbType(String dbType)  
        {  
            contextHolder.set(dbType);  
        }  
      
        /** 
         * 取得当前数据源。 
         * @return 
         */  
        public static String getDbType()  
        {  
            String str = (String) contextHolder.get();  
            return str;  
        }  
          
        /** 
         * 清除上下文数据 
         */  
        public static void clearDbType()  
        {  
            contextHolder.remove();  
        }  
    }

    三、注意点

    Spring单数据源直接在<bean id="dataSource">下配置数据源的各种连接参数。但动态数据源需要配置个各个数据源例如ds1、ds2等。然后在dataSource中动态根据传递过来的参数动态调用不同的数据源。
    1、当进行访问时,首先通过DataSourceContextHolder.setDbType("ds1");设置需要使用的数据源。DataSourceContextHolder就是一个用来存储数据源信息的类,其中通过ThreadLocal来记录数据源信息。
    2、DynamicDataSource类集成Spring的AbstractRoutingDataSource类,通过determineCurrentLookupKey方法来获取数据源类型,如果没有对应的数据源则使用defaultTargetDataSource配置。
    3、当设置了数据源之后会一直使用该数据源进行连接,除非使用 DataSourceContextHolder.setDbType重新设置数据源或使用DataSourceContextHolder.clearDbType()清除,清除后使用defaultTargetDataSource进行连接。(这点很重要)

    转载自:https://my.oschina.net/qweasfzxc880/blog/621113?p={{page}}

  • 相关阅读:
    eclipse下jsp文件报错解决方法
    使用vscode搭建本地的websocket
    tomcat的首次登录配置
    tomcat配置报错解决方法 The jre_home environment variable is not defined correctly
    cento升级openssl依旧显示老版本
    Centos6安装mysql5.7最新版
    Neutron服务组件
    网络OSI 7层模型
    Kubernetes的核心技术概念和API对象
    Xen 虚拟化技术
  • 原文地址:https://www.cnblogs.com/aaron-shu/p/5985659.html
Copyright © 2011-2022 走看看