Spring配置动态数据源实现读写分离的方法

网友投稿 236 2023-06-17


Spring配置动态数据源实现读写分离的方法

前言

最近因为工作的需要,要搭建的一个项目需要实现数据源的读写分离,在这里将代码进行分享,有需要的朋友们可以参考学习。

首先是配置数据源

//配置省略

//配置省略

//配置省略

数据源是如何切换的呢?通过动态数据源的配置我们知道原来是通过key来进行切换,这里要使用到org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource,我们可以编写自己的动态数据源类DynamicDataSource来继承它。

public class DynamicDataSource extends AbstractRoutingDataSource {

@Override

protected Object determineCurrentLookupKey() {

return DataSourceContextHolder.getType();

}

}

还需要一个存放key的地方DataSourceContextHolder 为保证切换时线程安全我们使用ThreadLocal来保存我们的key。

public class DataSourceContextHolder {

private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceContextHolder.class);

public static final String DATA_SOURCE_WRITE = "WRITE";

public static final String DATA_SOURCE_READ = "READ";

// 线程本地环境

private static final ThreadLocal contextHolder = new ThreadLocal();

// 设置数据源类型

public static void setType(String type) {

if(LOGGER.isDebugEnabled())

LOGGER.debug("==============切换数据源,类型:"+type+"================");

contextHolder.set(type);

}

// 获取数据源类型

public static String getType() {

return (contextHolder.get());

}

// 清除数据源类型

public static void clearType() {

contextHolder.remove();

}

}

好了,我们可以通过操作DataSourceContextHolder来实现数据源动态的切换了。小伙伴们可能会说了,难道每次调用方法都要手动选择要切换的数据源类型?当然不是啦,Spring AOP登场。

@Component

@Aspect

public class DynamicDataSourceAspect {

@Pointcut("ehttp://xecution (* com.potato.orm.mapper.*.select*(..)) || execution (* com.potato.orm.mapper.*.count*(..)) ")

public void readMethodPointcut() {}

@Pointcut("execution (* com.potato.orm.mapper.*.insert*(..)) || execution (* com.potato.orm.mapper.*.update*(..)) || execution (* com.potato.orm.mapper.*.delete*(..))")

public void writeMethodPointcut() {}

@Before("readMethodPointcut()")

public void switchReadDataSource(){

//System.out.println("============切换到读数据源===========");

DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_READ);

}

@Before("writeMethodPointcut()")

public void switchWriteDataSource(){

//System.out.println("=============切换到写数据源==========");

DataSourceContextHolder.setType(DataSourceContextHolder.DATA_SOURCE_WRITE);

}

}

总结

好啦,以上就是这篇文章的全部内容了,在访问Mapper(本项目使用的是MyBatis啦,相当于是DAO)中查询方法时会切换到读数据源,增、删、改方法会切换到写数据源。希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java 集合中的类关于线程安全
下一篇:Java命名规范
相关文章

 发表评论

暂时没有评论,来抢沙发吧~