一、首先配置兩個數據源(數據庫)以及一個動態數據庫:java
<!-- 數據源1 spring自帶的 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 這裏的driverClassName指的是數據庫驅動這裏要根據使用的數據庫進行更改這裏使用的SQLServer數據庫 --> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property> <!-- 這裏url主要說明的數據庫的位置和調用那個數據庫其中jdbc後面是位置而DatebaseName所說的是數據庫的名稱 --> <property name="url" value="jdbc:sqlserver://數據庫ip地址:端口號;DatabaseName=數據庫1名稱;?useUnicode=true&characterEncoding=UTF-8" /> <!-- 下面的2行username和password主要是說明的登陸的用戶名和密碼這裏根據項目的不一樣進行修改 --> <property name="username" value="數據庫鏈接帳號"></property> <property name="password" value="數據庫鏈接密碼"></property> </bean> <!-- 數據源2--> <bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 這裏的driverClassName指的是數據庫驅動這裏要根據使用的數據庫進行更改這裏使用的SQLServer數據庫 --> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property> <!-- 這裏url主要說明的數據庫的位置和調用那個數據庫其中jdbc後面是位置而DatebaseName所說的是數據庫的名稱 --> <property name="url" value="jdbc:sqlserver://數據庫ip地址:端口號;DatabaseName=數據庫2名稱;?useUnicode=true&characterEncoding=UTF-8" /> <!-- 下面的2行username和password主要是說明的登陸的用戶名和密碼這裏根據項目的不一樣進行修改 --> <property name="username" value="數據庫鏈接帳號"></property> <property name="password" value="數據庫鏈接密碼"></property> </bean> <!--配置動態數據庫--> <bean id="dynamicDataSource" class="com.datasource.DynamicDataSource" > <property name="targetDataSources"> <map key-type="java.lang.String"> <entry value-ref="dataSource" key="dataSource"></entry> <entry value-ref="dataSource2" key="dataSource2"></entry> </map> </property> <property name="defaultTargetDataSource" ref="dataSource" > </property> </bean>
二、sqlSessionFactory引用的數據庫是動態數據庫dynamicDataSource:spring
<!-- 掃描mybatis的配置結合上面的DataSource,會生成一個sqlFactory。這裏通常來講不用改 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dynamicDataSource" /> <!-- 將mybatis的配置文件引入 --> <property name="configLocation" value="classpath:myBatisConfig.xml"></property> </bean>
四、事務管理這裏要管理的也是上面配置的dynamicDataSource動態數據庫:sql
<!-- 配置了事務的管理。通常來講不用改 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dynamicDataSource"></property> </bean>
五、寫兩個數據源配置類DataSourceContextHolder.java和DynamicDataSource.java來配置數據源,利用ThreadLocal解決線程安全問題。數據庫
DataSourceContextHolder 類:安全
package com.datasource; public class DataSourceContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setCustomerType(String customerType) { contextHolder.set(customerType); } public static String getCustomerType() { return contextHolder.get(); } public static void clearCustomerType() { contextHolder.remove(); } }
DynamicDataSource 類繼承 AbstractRoutingDataSource,並實現determineCurrentLookupKey方法:mybatis
package com.datasource; import java.sql.SQLFeatureNotSupportedException; import java.util.logging.Logger; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource { @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException { // TODO 自動生成的方法存根 return null; } @Override protected Object determineCurrentLookupKey() { // TODO 自動生成的方法存根 return DataSourceContextHolder.getCustomerType(); } }
六、最後就能夠在須要切換數據庫的地方使用如下方法來切換數據庫了,要切換的數據庫名字即以前在配置動態數據庫時給引用的數據庫賦的名字:ide
DataSourceContextHolder.setCustomerType("要切換的數據庫名字");
七、下面附上個人目錄結構:sqlserver
注:每次使用完切換數據庫的方法後,系統會自動切換回默認數據庫,不過這之間存在一點小延遲,會出如今調用完切換數據庫的方法後,馬上去跳轉到引用另一個數據庫數據的頁面,系統仍是使用着切換後的數據庫。url
解決辦法:能夠在使用完切換數據庫的方法拿到須要的數據後,再次調用 DataSourceContextHolder.setCustomerType() 方法切換回接下來須要用到的數據庫。spa