项目中要求读写分离,在spring中做到读写分离,很简单的想到在配置文件中设置两个数据源,一个datesource(只写),一个datesourceread(只读)。但是要根据上下文动态切换数据源,还需要增加两个帮助类。
类1 ContextHolder
主要功能是帮助切换数据源,其中ThreadLocal保证线程中的一致性,不受其他线程影响。
public class ContextHolder {
public static final String DATA_SOURCE = "dataSource";
public static final String DATA_SOURCE_READ = "dataSourceRead";
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public static void setCustomerType(String customerType){
contextHolder.set(customerType);
}
public static String getCustomerType(){
return contextHolder.get();
}
public static void clearCustomerType(){
contextHolder.remove();
}
}
类2 MyDataSource
自定义数据源,继承AbstractRoutingDataSource,实现determineCurrentLookupKey()方法。
public class MyDataSource extends AbstractRoutingDataSource {
/* (non-Javadoc)
* @see org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource#determineCurrentLookupKey()
*/
@Override
protected Object determineCurrentLookupKey() {
return ContextHolder.getCustomerType();
}
}
配置文件中这样配置:
<bean id="abstractDataSource" abstract="true"