大家在日常后端開發過程,不可避免的會接觸到需要用到配置多個數據源的場景,在這里,小編介紹一種簡單方便的,只需要簡單的配置和一個@DS注解就能實現動態數據源的方式,這種動態數據源底層原理是基于Mybatis-plus來實現的。
首先是pom.xml
<dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.4.1</version></dependency>
隨后配上多數據源,我們的項目中分別配置了Mysql和Doris兩種數據庫
spring: datasource: druid: localdb: url: xxx username: xxx driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource doris: url: xxx username: xxx driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource
最后需要使用哪個數據庫,在對應的方法上加上對應的@DS(“數據庫名”)注解就可以了,在類上加@DS(“數據庫名”),那么整個類下的所有方法都會使用到這個數據源,實現方式是不是非常簡單。
@Service@DS("localdb")public class testServiceImpl extends BaseServiceImpl<testMapper, testBean> implements testService { public void save(String arg1) { //TODO } public void find(String arg2) { //TODO }}
底層實現核心類是
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數據源,這完成了對應的動態數據源切換。
基于Mybatis-plus的@DS注解可以實現動態數據源切換,具有實現簡單的優點,雖然沒有AOP實現,但是用到了AOP的思想,后續小編將寫一篇基于AOP的實現方式,歡迎大家關注。
作者:京東保險 郭盼
來源:京東云開發者社區 轉載請注明來源
本文鏈接:http://www.tebozhan.com/showinfo-26-16017-0.html多數據源管理:掌握@DS注解的威力
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
下一篇: 線程類型詳解之線程優化使用技巧