项目中两种数据源的切换(针对项目中不同的数据库使用不同的数据源)

  那天接触公司项目,发现使用的是两种数据库,一个是SqlServer,一个是医院的oracle数据库,但是查询数据的时候不能够一起查询,需要自己去手动切换数据源

  在Spring-Mybatis中,有这样一个类AbstractRoutingDataSource,根据名字可以猜到,这是一个框架提供的用于动态选择数据源的类。这个类有两个重要的参数,分别叫

defaultTargetDataSource和targetDataSources。一般的工程都是一个数据源,所以不太接触到这个类。

  下面是我们配置的xml中的数据源

   

<!--统一的dataSource-->
<bean id="dynamicDataSource" class="com.yhhis.util.DynamicDataSource" >
<property name="targetDataSources">
<map key-type="java.lang.String">
<!--通过不同的key决定用哪个dataSource-->
<entry value-ref="basedataSource" key="basedataSource"></entry>
<entry value-ref="hisdataSource" key="hisdataSource"></entry>
</map>
</property>
<!--设置默认的dataSource-->
<property name="defaultTargetDataSource" ref="basedataSource">
</property>
</bean>

<!-- 本地数据源 -->
<bean id="basedataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${driverClassName}"/>
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />

<!-- 初始化连接大小 -->
<property name="initialSize" value="${initialSize}" />
<!-- 连接池最大使用连接数量 -->
<property name="maxActive" value="${maxActive}" />
<!-- 连接池最大空闲 -->
<!-- <property name="maxIdle" value="${maxIdle}" /> -->
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${minIdle}" />
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${maxWait}" />

<!-- <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="33" />
-->

<property name="validationQuery" value="${validationQuery}" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="testWhileIdle" value="true" />

<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="25200000" />

<!-- 打开removeAbandoned功能 -->
<property name="removeAbandoned" value="true" />
<!-- 1800秒,也就是30分钟 -->
<property name="removeAbandonedTimeout" value="1800" />
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="true" />

<!-- 监控数据库 -->
<!-- <property name="filters" value="stat" /> -->
<property name="filters" value="mergeStat" />
</bean>

<!-- HIS数据源 -->
<bean id="hisdataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${his.driverClassName}"/>
<property name="url" value="${his.url}" />
<property name="username" value="${his.username}" />
<property name="password" value="${his.password}" />

<!-- 初始化连接大小 -->
<property name="initialSize" value="${his.initialSize}" />
<!-- 连接池最大使用连接数量 -->
<property name="maxActive" value="${his.maxActive}" />
<!-- 连接池最大空闲 -->
<!-- <property name="maxIdle" value="${his.maxIdle}" /> -->
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${his.minIdle}" />
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${his.maxWait}" />

<!-- <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="33" />
-->

<property name="validationQuery" value="${his.validationQuery}" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="testWhileIdle" value="true" />

<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="25200000" />

<!-- 打开removeAbandoned功能 -->
<property name="removeAbandoned" value="true" />
<!-- 1800秒,也就是30分钟 -->
<property name="removeAbandonedTimeout" value="1800" />
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="true" />

<!-- 监控数据库 -->
<!-- <property name="filters" value="stat" /> -->
<property name="filters" value="mergeStat" />
</bean>

选择线程类

  

public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return CustomerContextHolder.getCustomerType();
}
}

具体的怎么去选择,使用哪个类去选择

public class CustomerContextHolder {
public static final String DATA_SOURCE_BASE = "basedataSource";
public static final String DATA_SOURCE_HIS = "hisdataSource";
//用ThreadLocal来设置当前线程使用哪个dataSource
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public static void setCustomerType(String customerType) {
contextHolder.set(customerType);
}
public static String getCustomerType() {
String dataSource = contextHolder.get();
if (Util.isEmpty(dataSource)) {
return DATA_SOURCE_BASE;
}else {
return dataSource;
}
}
public static void clearCustomerType() {
contextHolder.remove();
}
}

这只是实现方式的一种,是一种比较简单的实现方式,还有其他的我就不介绍了

猜你喜欢

转载自www.cnblogs.com/yld77/p/9262482.html