• SpringMVC配置多个数据源


    多数据源,说白了,就是多数据库。

    想要实现多数据库查询,只需简单四步即可实现! 但这种实现方式有缺点,不能够实时切换数据库。有时间我会补一篇,通过AOP实现数据库切换的博客,通过aop+注解实现比较好。

    第一步: 配置 jdbc.properties;

     1 # MySQL
     2 #============================================================================
     3 jdbc.mysql.driver=com.mysql.jdbc.Driver
     4 jdbc.mysql.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
     5 jdbc.mysql.username=root
     6 jdbc.mysql.password=root
     7 
     8 # MS SQL Server (JTDS)
     9 #============================================================================
    10 jdbc.sqlserver.driver=net.sourceforge.jtds.jdbc.Driver
    11 jdbc.sqlserver.url=jdbc:jtds:sqlserver://127.0.0.1:1433/test
    12 jdbc.sqlserver.username=sa
    13 jdbc.sqlserver.password=sa
    14 
    15 # 通用配置
    16 #============================================================================
    17 jdbc.initialSize=5
    18 jdbc.minIdle=5
    19 jdbc.maxIdle=20
    20 jdbc.maxActive=100
    21 jdbc.maxWait=100000

    第二步:配置 spring-mybatis.xml;

     1  <!-- 多数据源配置 -->
     2     <bean id="sqlServerDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
     3         <property name="driverClassName" value="${jdbc.sqlserver.driver}"/>
     4         <property name="url" value="${jdbc.sqlserver.url}"/>
     5         <property name="username" value="${jdbc.sqlserver.username}"/>
     6         <property name="password" value="${jdbc.sqlserver.password}"/>
     7         <property name="initialSize" value="${jdbc.initialSize}"/>
     8         <property name="minIdle" value="${jdbc.minIdle}"/>
     9         <property name="maxIdle" value="${jdbc.maxIdle}"/>
    10         <property name="maxActive" value="${jdbc.maxActive}"/>
    11         <property name="maxWait" value="${jdbc.maxWait}"/>
    12         <property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}"/>
    13         <property name="removeAbandoned" value="${jdbc.removeAbandoned}"/>
    14         <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}"/>
    15         <property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>
    16         <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}"/>
    17         <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}"/>
    18         <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}"/>
    19     </bean>
    20     <bean id="mySqlDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    21         <property name="driverClassName" value="${jdbc.mysql.driver}"/>
    22         <property name="url" value="${jdbc.mysql.url}"/>
    23         <property name="username" value="${jdbc.mysql.username}"/>
    24         <property name="password" value="${jdbc.mysql.password}"/>
    25         <property name="initialSize" value="${jdbc.initialSize}"/>
    26         <property name="minIdle" value="${jdbc.minIdle}"/>
    27         <property name="maxIdle" value="${jdbc.maxIdle}"/>
    28         <property name="maxActive" value="${jdbc.maxActive}"/>
    29         <property name="maxWait" value="${jdbc.maxWait}"/>
    30         <property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}"/>
    31         <property name="removeAbandoned" value="${jdbc.removeAbandoned}"/>
    32         <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}"/>
    33         <property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>
    34         <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}"/>
    35         <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}"/>
    36         <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}"/>
    37     </bean>
    38                     
    39     <bean id="dataSource" class="xx.xxx.DynamicDataSource"><!--注意: 这里写选择数据源的类地址 下面跟着给出-->
    40         <property name="defaultTargetDataSource" ref="mySqlDataSource"/><!-- 设置默认为此mySqlDataSource数据源-->
    41         <property name="targetDataSources">
    42             <map>
    43                 <entry key="mySqlDataSource" value-ref="mySqlDataSource"/>
    44                 <entry key="sqlServerDataSource" value-ref="sqlServerDataSource"/>
    45             </map>
    46         </property>
    47     </bean>

    第三步:添加数据源的类;(借助ThreadLocal类,通过ThreadLocal类传递数据源的参数)

     1 import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;  
     2 /* 
     3  * 配置多数据源 
     4  */  
     5 
     6 public class DynamicDataSource extends AbstractRoutingDataSource{  
     7   
     8     public static final String  mySqlDataSource= "mySqlDataSource";  
     9       
    10     public static final String sqlServerDataSource = "sqlServerDataSource";  
    11     //本地线程,获取当前正在执行的currentThread  
    12     public static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();   
    13       
    14     public static void setCustomerType(String customerType) {  
    15   
    16         contextHolder.set(customerType);  
    17       
    18     }  
    19   
    20     public static String getCustomerType() {  
    22         return contextHolder.get();       
    24     }  
    25   
    26     public static void clearCustomerType() {  
    28         contextHolder.remove();  
    30     }  
    31   
    32     @Override  
    33     protected Object determineCurrentLookupKey() {  
    35         return getCustomerType();    
    37     }  
    38 }

    最后一步:使用;

     public void  findOrder(){
              List<PayOrder> list = new ArrayList<>();
    DynamicDataSource.clearCustomerType();//重点: 实际操作证明,切换的时候最好清空一下
    DynamicDataSource.setCustomerType(DynamicDataSource.sqlServerDataSource);//切换数据源,设置后 就OK了。可以随时切换过来(在controller层切换)
          list =mapper.findByUid("-14663");
          System.out.println(list);
          DynamicDataSource.clearCustomerType();//
          DynamicDataSource.setCustomerType(DynamicDataSource.sqlServerDataSource);//切换回主数据源 

    6 }
  • 相关阅读:
    PHP date函数时间相差8个小时解决办法
    PHP中include()与require()的区别说明
    post与get区别
    MFC 对话框控件自动布局
    Apache php Mysql部署(一)下载安装
    apache 重定向
    clistctrl失去焦点高亮显示选中行
    格式化字符串
    unicode编码与utf-8 区别
    string的实现
  • 原文地址:https://www.cnblogs.com/hero123/p/8945914.html
Copyright © 2020-2023  润新知