多数据源管理:掌握 @DS 注解的威力 | 京东云技术团队

大家在日常后端开发过程,不可避免的会接触到需要用到配置多个数据源的场景,在这里,小编介绍一种简单方便的,只需要简单的配置和一个 @DS 注解就能实现动态数据源的方式,这种动态数据源底层原理是基于 Mybatis-plus 来实现的。
1、配置方式
首先是 pom.xml
随后配上多数据源,我们的项目中分别配置了 Mysql 和 Doris 两种数据库
最后需要使用哪个数据库,在对应的方法上加上对应的 @DS(“数据库名”)注解就可以了,在类上加 @DS(“数据库名”),那么整个类下的所有方法都会使用到这个数据源,实现方式是不是非常简单。
1、底层实现原理
底层实现核心类是 com.baomidou.dynamic.datasource.DynamicRoutingDataSource,继承自 AbstractDataSource


项目在初始化的时候会调用 DynamicRoutingDataSource 里面的 public synchronized void addDataSource(String ds, DataSource dataSource)方法加载数据源,数据源存进 dataSourceMap 中。

随后,如果进行数据库操作,以方法为最小粒度,执行对应方法时,会被 DynamicDataSourceAnnotationInterceptor 拦截器拦截

执行 determineDatasource 方法,扫描加了 @DS 注解的类或者方法,随后调用 DynamicDataSourceContextHolder.poll 方法。

DynamicDataSourceContextHolder.poll 方法将当前线程的数据源名加到对应的 ThreadLocal 线程本地中

在之后的数据操作中,会调用 org.springframework.jdbc.datasource.getConnection()方法,ThreadLocal 中获取之前拦截器存进去动态数据源名,如果没有获取到,就默认为配置的 primary 数据源,这完成了对应的动态数据源切换。

3、总结
基于 Mybatis-plus 的 @DS 注解可以实现动态数据源切换,具有实现简单的优点,虽然没有 AOP 实现,但是用到了 AOP 的思想,后续小编将写一篇基于 AOP 的实现方式,欢迎大家关注。
作者:京东保险 郭盼
来源:京东云开发者社区 转载请注明来源
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/cdf6703dca581ac55c62f5d09】。文章转载请联系作者。
评论