配置多數據源並動態切換


由於開發需求,項目上要使用多數據源,一個鏈接oracle一個鏈接sqlserver,也沒有弄過,在度娘上看了一篇文章很受啓發http://blog.csdn.net/q908555281/article/details/50316137,於是自己動手實踐,第一次配置沒有很多問題,自己也算是幸運的孩子,不過很簡單
,不需要多少腦細胞。

這是spring配置

	<!--導入quartz  -->
	<!--<import resource="applicationContext-quartz.xml"/> --> 
	<!-- <import resource="applicationContext-aop.xml"/> -->
	<!--oracle數據源  -->
	<bean id="oracle_dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        init-method="init" destroy-method="close">
        <!-- 數據庫基本信息配置 -->
        <property name="driverClassName" value="${ORACLE_DB_DRIVER}" />
         <!-- 本機地址 -->
        <property name="url" value="${ORACLE_DB_URL}" />
        <property name="username" value="${ORACLE_DB_USER}" />
        <property name="password" value="${ORACLE_DB_PASSWORD}" />      
        <!-- 初始化連接數量 -->
        <property name="initialSize" value="5" />
        <!-- 最大併發連接數 -->
        <property name="maxActive" value="20" />
        <!-- 最小空閒連接數 -->
        <property name="minIdle" value="5" />
        <!-- 配置獲取連接等待超時的時間 -->     
        <property name="maxWait" value="60000" />
        <!-- 超過時間限制是否回收 -->
        <property name="removeAbandoned" value="true" />
        <!-- 超過時間限制多長,單位:秒 -->
        <property name="removeAbandonedTimeout" value="600" />
        <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000" />
        <!-- 用來檢測連接是否有效的sql,要求是一個查詢語句-->
        <property name="validationQuery" value="SELECT 1 from  dual" />
        <!-- 申請連接的時候檢測 -->
        <property name="testWhileIdle" value="true" />
        <!--屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有:                 
                監控統計用的filter:stat
                日誌用的filter:log4j
               防禦SQL注入的filter:wall -->
        <property name="filters" value="stat" />       
    </bean> 
    
    <!-- mysql數據源 -->
	<!-- 數據源配置, 使用druid連接池 -->
	<bean id="mysql_dataSource" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName" value="${MYSQL_DB_DRIVER}" />
		<property name="url" value="${MYSQL_DB_URL}" />
		<property name="username" value="${MYSQL_DB_USER}" />
		<property name="password" value="${MYSQL_DB_PASSWORD}" />
		<property name="filters" value="mergeStat" />
		<!-- 密碼解密 -->
		<!-- <property name="filters" value="config" />
		<property name="connectionProperties" value="config.decrypt=true" /> -->
		<!-- 申請連接的時候檢測 -->
		<property name="testWhileIdle" value="true"></property> 
		<!-- 檢測連接 -->
		<property name="validationQuery" value="select 'x'"></property>
		<!--maxActive: 最大連接數量 -->
		<property name="maxActive" value="40" />
		<!--initialSize: 初始化連接 -->
		<property name="initialSize" value="5" />
	</bean>
	
	<!-- 動態配置數據源 -->  
   <bean id ="dataSource" class= "com.sjt.datasource.DynamicDataSource" >  
          <property name ="targetDataSources">  
                <map key-type ="java.lang.String">  
                      <entry value-ref ="oracle_dataSource" key= "oracle_dataSource"></entry >  
                      <entry value-ref ="mysql_dataSource" key= "mysql_dataSource"></entry >  
                </map >  
          </property >  
          <property name ="defaultTargetDataSource" ref= "oracle_dataSource"></property >      <!-- 默認使用ds1的數據源 -->  
   </bean >  
	
	
	
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<!-- 自動掃描mapping.xml文件 -->  
		<property name="mapperLocations">
			<list>
				<value>classpath:mapping/*Mapper.xml</value>
			</list>
		</property>
	</bean>


這是動態切換工具

/**
 * @ClassName: DataSourceContextHolder
 * @Description: 數據庫切換工具類
 * @author: libiao
 * @date: 2015-12-14 下午5:56:27
 */
public class DataSourceContextHolder {
	private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

	public static void setDbType(String dbType) {
		contextHolder.set(dbType);
	}

	public static String getDbType() {
		return ((String) contextHolder.get());
	}

	public static void clearDbType() {
		contextHolder.remove();
	}
}

這是切換類

public class DynamicDataSource extends AbstractRoutingDataSource {


    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDbType();
    }

}

這是靜態產量

public class DataSourceType {
  
    public static final String ORACLE_ADMIN = "oracle_dataSource";
 
    public static final String MYSQL_PARTNER = "mysql_dataSource";
}


再說一次很簡單 這樣調用就可以了

 //切換數據庫  
              DataSourceContextHolder. setDbType(DataSourceType.MYSQL_PARTNER);  
 這樣就達到了你想要的效果,親測有效。。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章