
- 编写AbstractRoutingDataSource的实现类,HandlerDataSource就是提供给我们动态选择数据源的数据的信息,我们这里编写一个根据当前线程来选择数据源,然后通过AOP拦截特定的注解,设置当前的数据源信息,也可以手动的设置当前的数据源,在编程的类中。
/**
* @author luhong
* @version 1.0
* @Description 获取动态数据源
* @date 10/22/2018
* @updateby
* @updatedate
* @since 1.0
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
public Object determineCurrentLookupKey() {
return DynamicDataSourceHolder.getDataSourceKey();
}
}
- 编写DynamicDataSourceHolder.class
/**
* @author luhong
* @version 1.0
* @Description
* @date 10/22/2018
* @updateby
* @updatedate
* @since 1.0
*/
public class DynamicDataSourceHolder {
//写库对应的数据源key
private static final String READ = "read";
//读库对应的数据源key
private static final String WRITE = "write";
//使用ThreadLocal记录当前线程的数据源key
private static final ThreadLocal<String> holder = new ThreadLocal<String>();
/**
* @author: luhong
* @Description 管理所有的数据源id; 主要是为了判断数据源是否存在;
* @Date 5:08 PM 10/27/2018
* @Param
* @return:
*/
public static List<String> dataSourceIds = new ArrayList<String>();
/**
* 设置数据源key
* @param key
*/
public static void setDataSourceKey(String key) {
holder.set(key);
}
/**
* 获取数据源key
* @return
*/
public static String getDataSourceKey() {
return holder.get();
}
/**
* 标记写库
*/
public static void markRead(){
setDataSourceKey(READ);
}
/**
* 标记读库
*/
public static void markWrite(){
setDataSour