多數據源,說白了,就是多數據庫。
想要實現多數據庫查詢,只需簡單四步即可實現! 但這種實現方式有缺點,不能夠實時切換數據庫。有時間我會補一篇,通過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 }
