spring+mybatis-->多資料來源配置
阿新 • • 發佈:2018-12-14
配置檔案:dataSource.xml,在ApplicationContext.xml中引入即可
<!-- 資料庫管理 -->
<import resource ="classpath:dataSource.xml"/>
dataSource.xml 配置如下:以使用 阿里 druid資料來源為例
<!-- 阿里 druid資料庫連線池 --> <bean id="dataSourceA" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <!-- 資料庫基本資訊配置 --> <property name="url" value="jdbc:mysql://127.0.0.1:3306/a?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&allowMultiQueries=true" /> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="username" value="root" /> <property name="password" value="root" /> <property name="filters" value="stat" />
<!-- 最大併發連線數 --> <property name="maxActive" value="20" /> <!-- 初始化連線數量 --> <property name="initialSize" value="1" /> <!-- 配置獲取連線等待超時的時間 --> <property name="maxWait" value="60000" /> <!-- 最小空閒連線數 --> <property name="minIdle" value="10" /> <!-- 最大空閒連線數 --> <property name="maxIdle" value="15" /> <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一個連線在池中最小生存的時間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <property name="maxOpenPreparedStatements" value="20" /> <!-- 開啟removeAbandoned功能 --> <property name="removeAbandoned" value="true" /> <!-- 1800秒,也就是30分鐘 --> <property name="removeAbandonedTimeout" value="1800" /> <!-- 關閉abanded連線時輸出錯誤日誌 --> <property name="logAbandoned" value="true" /> </bean>
<bean id="dataSourceB" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<!-- 資料庫基本資訊配置 -->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/b?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&allowMultiQueries=true" />
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="filters" value="stat" />
<!-- 最大併發連線數 -->
<property name="maxActive" value="20" />
<!-- 初始化連線數量 -->
<property name="initialSize" value="1" />
<!-- 配置獲取連線等待超時的時間 -->
<property name="maxWait" value="60000" />
<!-- 最小空閒連線數 -->
<property name="minIdle" value="10" />
<!-- 最大空閒連線數 -->
<property name="maxIdle" value="15" />
<!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一個連線在池中最小生存的時間,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="SELECT 'x'" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="maxOpenPreparedStatements" value="20" />
<!-- 開啟removeAbandoned功能 -->
<property name="removeAbandoned" value="true" />
<!-- 1800秒,也就是30分鐘 -->
<property name="removeAbandonedTimeout" value="1800" />
<!-- 關閉abanded連線時輸出錯誤日誌 -->
<property name="logAbandoned" value="true" />
</bean>
<!-- 動態配置資料來源 -->
<bean id ="dataSource" class= "com.DataSource.DynamicDataSource" >
<property name ="targetDataSources">
<map key-type ="java.lang.String">
<entry value-ref ="dataSourceA" key= "dataSourceA"></entry >
<entry value-ref ="dataSourceB" key= "dataSourceB"></entry >
</map >
</property >
<!-- 預設使用km的資料來源 -->
<property name ="defaultTargetDataSource" ref= "dataSourceA"></property >
</bean >
<!-- 配置事務 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
資料庫切換的工具類:用來切換資料庫:
/**
* 資料庫切換的工具類:用來切換資料庫
* @ClassName: DataSourceContextHolder
* @Description: (這裡用一句話描述這個類的作用)
* @author zhu
* @date 2017年3月28日 下午1:41:17
*
*/
public class DataSourceContextHolder {
// 執行緒本地環境
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
/**
* 設定資料來源型別 引數來源:DataSourceType 類
* 使用1:DataSourceContextHolder.setDataSourceType(DataSourceType.SOURCE_ONE);
* 使用2:DataSourceContextHolder.setDataSourceType(DataSourceType.SOURCE_TWO);
* @Description(這裡用一句話描述這個方法的作用)
* @return void
* @author zhu
*/
public static void setDataSourceType(String dbType) {
contextHolder.set(dbType);
}
// 獲取資料來源型別
public static String getDataSourceType() {
return ((String) contextHolder.get());
}
// 清除資料來源型別
public static void clearDataSourceType() {
contextHolder.remove();
}
}
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
* 繼承AbstractRoutingDataSource,並重寫determineCurrentLookupKey()方法,來達到動態切換資料庫
* 注意,這個類必須繼承AbstractRoutingDataSource,且實現方法determineCurrentLookupKey,
* 該方法返回一個Object,一般是返回字串:
* @ClassName: DynamicDataSource
* @Description: (這裡用一句話描述這個類的作用)
* @author zhu
* @date 2017年3月28日 下午1:42:31
*
*/
public class DynamicDataSource extends AbstractRoutingDataSource{
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
}
/**
* 在進行DAO操作前,通過上下文環境變數,獲得資料來源的型別
* (non-Javadoc)
* @see org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource#determineCurrentLookupKey()
*/
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceType();
}
}
/**
* 資料來源ID 資料庫型別常量類:必須與 xml配置中的value-ref的值保持一致
* @ClassName: DataSourceType
* @Description: (這裡用一句話描述這個類的作用)
* @author zhu
* @date 2017年3月29日 下午1:20:30
*
*/
public class DataSourceType {
//127.0.0.1/A
public static final String SOURCE_ONE = "dataSourceA";
//127.0.0.1/B
public static final String SOURCE_TWO = "dataSourceB";
}