最近项目需要切换数据源,查询了相关资料后做了一个简单的数据源的切换。
一、基本的简单配置
首先是我认为比较好的切换是在service层进行切换,基本思想是利用spring的AbstractRoutingDataSource类进行datasource的选择,就像map的key-value,AbstractRoutingDataSource是有个determineCurrentLookupKey选择datasource的bean进行切换。
下面是java类的配置
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource{
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSource();
}
}
/**数据源的管理类**/
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public static final String DEFAULT_DATA_SOURCE="defaultDataSource"; //默认数据源
public static final String READ_DATA_SOURCE="readDataSource"; //第二个数据源,因为这个数据源是只提供读取,所以叫read...
/**
* 设置数据源类型
* @param dataSource 数据源名称
*/
public static void setDataSource(String dataSource) {
contextHolder.set(dataSource);
}
/**
* 获取数据源名称
*/
public static String getDataSource() {
return contextHolder.get();
}
/**
* 清除数据源名称
*/
public static void clearDataSource() {
contextHolder.remove();
}
}
接下来要在xml文件中配置动态的数据源
部分配置文件如下:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dynamicDataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath*:/com/test/core/do