1. 程式人生 > >spring+mybatis-->多資料來源配置

spring+mybatis-->多資料來源配置

配置檔案: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>


class類:

資料庫切換的工具類:用來切換資料庫:

/**
  * 資料庫切換的工具類:用來切換資料庫
  * @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";
	
}