多数据源问题很常见,例如读写分离数据库配置。
原来的项目出现了新需求,局方要求新增某服务器用以提供某代码,涉及到多数据源的问题。
研究成果如下:
1、首先配置多个 datasource
-
<property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver">
-
</property>
-
<property name="url" value="jdbc:jtds:sqlserver://10.82.81.51:1433;databaseName=standards">
-
</property>
-
<property name="username" value="youguess"></property>
-
<property name="password" value="youguess"></property>
-
</bean>
-
<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource">
-
<property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver">
-
</property>
-
<property name="url" value="jdbc:jtds:sqlserver://10.82.81.52:1433;databaseName=standards">
-
</property>
-
<property name="username" value="youguess"></property>
-
<property name="password" value="youguess"></property>
2、写一个 DynamicDataSource 类继承 AbstractRoutingDataSource,并实现 determineCurrentLookupKey 方法
-
package com.standard.core.util;
-
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
-
public class DynamicDataSource extends AbstractRoutingDataSource {
-
@Override
-
protected Object determineCurrentLookupKey() {
-
return CustomerContextHolder.getCustomerType();
-
}
-
}
3、利用 ThreadLocal 解决线程安全问题
-
package com.standard.core.util;
-
public class CustomerContextHolder {
-
public static final String DATA_SOURCE_A = "dataSource";
-
public static final String DATA_SOURCE_B = "dataSource2";
-
private static final ThreadLocal contextHolder = new ThreadLocal();
-
public static void setCustomerType(String customerType) {
-
contextHolder.set(customerType);
-
}
-
public static String getCustomerType() {
-
return contextHolder.get();
-
}
-
public static void clearCustomerType() {
-
contextHolder.remove();
-
}
-
}
4、数据源配置
-
<property name="targetDataSources">
-
<map key-type="java.lang.String">
-
<entry value-ref="dataSource" key="dataSource"></entry>
-
<entry value-ref="dataSource2" key="dataSource2"></entry>
-
</map>
-
</property>
-
<property name="defaultTargetDataSource" ref="dataSource" >
-
</property>
-
</bean>
5、在 DAOImpl 中切换数据源
- CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_B);
搞定!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于