由於開發需求,項目上要使用多數據源,一個鏈接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);
這樣就達到了你想要的效果,親測有效。。