spring-web项目多数据源配置
1.配置spring配置文件
<bean name="a-datasource" class="com.alibaba.druid.pool.DruidDataSsorce" init-method="init" destory-method="close" >
<poropety name="url" value=""/>
<poropety name="name" value=""/>
<poropety name="password" value=""/>
<poropety name="initialSize" value=""/>
</bean>
<bean name="b-datasource" class="com.alibaba.druid.pool.DruidDataSsorce" init-method="init" destory-method="close">
<poropety name="url" value=""/>
<poropety name="name" value=""/>
<poropety name="password" value=""/>
<poropety name="initialSize" value=""/>
</bean>
<bean id="DynamicDataSource" class="com.hxy.base.utils.DynamicDataSource">
<propety name="targetDataSource">
<map key-type="java.lang.String">
<entry value-ref="a-dataSource" key="Asource"><entry>
<entry value-ref="b-dataSource" key="Bsource"><entry>
<propety name="defaultTargetDataSource" ref="dataSource"/>
</bean>
配置多数据源文件内AB两个数据源,DynamicDataSource为继承 AbstractRoutingDataSource也就是数据源路由的子类。
public class DynamicDataSource extends AbstractRoutingDataSource{
@Override
protected Object determinCurrentLookupKey(){
//DataSourceContentHandler为自定义类用于切换数据源
return DataSourceContentHandler.getDataSourceType();
}
}
DataSourceContentHandler中包含本地线程锁,避免由于并发引起的数据源切换混乱。
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
/**
* @Description: 设置数据源类型
* @param dataSourceType 数据库类型
* @return void
* @throws
*/
public static void setDataSourceType(String dataSourceType) {
System.err.println(dataSourceType);
contextHolder.set(dataSourceType);
}
/**
* @Description: 获取数据源类型
* @param
* @return String
* @throws
*/
public static String getDataSourceType() {
return contextHolder.get();
}
/**
* @Description: 清除数据源类型
* @param
* @return void
* @throws
*/
public static void clearDataSourceType() {
contextHolder.remove();
}
在业务层也就是service层 执行底层持久化方法前后使用切换,方法完毕后切换为默认数据源(缺点是使用不便代码冗余),也可以采用aop方式进行切点实现。在需要执行切换数据源方法加入自定义注解即可。