由于开发需求,项目上要使用多数据源,一个链接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);
这样就达到了你想要的效果,亲测有效。。