多数据源管理:掌握@DS注解的威力

数据源,管理,掌握,ds,注解,威力 · 浏览次数 : 53

小编点评

**动态数据源配置** **步骤 1:配置数据源** 在项目构建配置文件 `pom.xml` 中配置数据源: ```xml com.baomidou dynamic-datasource-spring-boot-starter 3.4.1 xxx xxx xxx xxx xxx xxx ``` **步骤 2:使用 @DS 注解实现动态数据源** 在类上添加 `@DS` 注解,指定数据源名称: ```java @Service @DS("localdb") public class testServiceImpl extends BaseServiceImpl<testMapper, testBean> implements testService { // ... } ``` **步骤 3:实现动态数据源切换** 在方法上添加 `@DS` 注解指定数据源名称: ```java @Override @DS("localdb") public void save(String arg1) { // ... } ``` **底层原理** * 使用 `DynamicRoutingDataSource` 实现了动态数据源切换。 * `DynamicRoutingDataSource` 在初始化时调用 `addDataSource` 方法加载数据源。 * `DynamicDataSourceAnnotationInterceptor` 在方法执行前拦截调用,扫描 `@DS` 注解的类或方法,并调用 `DynamicDataSourceContextHolder.poll` 获取当前线程的数据源名。 * `DynamicDataSourceContextHolder.poll` 将当前线程的数据源名添加到 `ThreadLocal` 中。 * 在数据库操作中,如果 `ThreadLocal` 中没有数据源名,则从配置的primary数据源获取数据。

正文

大家在日常后端开发过程,不可避免的会接触到需要用到配置多个数据源的场景,在这里,小编介绍一种简单方便的,只需要简单的配置和一个@DS注解就能实现动态数据源的方式,这种动态数据源底层原理是基于Mybatis-plus来实现的。

1、配置方式

首先是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
    }
}


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的实现方式,欢迎大家关注。

作者:京东保险 郭盼

来源:京东云开发者社区 转载请注明来源

与多数据源管理:掌握@DS注解的威力相似的内容:

多数据源管理:掌握@DS注解的威力

大家在日常后端开发过程,不可避免的会接触到需要用到配置多个数据源的场景,在这里,小编介绍一种简单方便的,只需要简单的配置和一个@DS注解就能实现动态数据源的方式,这种动态数据源底层原理是基于Mybatis-plus来实现的。

All in One:Prometheus 多实例数据统一管理最佳实践

当管理多个Prometheus实例时,阿里云Prometheus托管版相比社区版提供了更可靠的数据采集和便捷的管理。本文比较了全局聚合实例与数据投递方案,两者在不同场景下各有优劣。

oracle并发与多版本控制

1 相关概念 1.1 并发控制 数据库对多个用户同时查询或者操作数据的管理。 1.2 多版本控制 oracle能物化多个版本的数据,使在一个时间点读一个表,保证在这个时间点读到的表数据是一致的。oracle的多版本控制机制是oracle提供读一致性的基础。 1.3 事务的作用 事务使数据库从一种一致

PostgreSQL插件那么多,怎样管理最高效?

摘要:华为云RDS for PostgreSQL通过插件管理功能,很好地解决了PostgreSQL版本与插件耦合的问题,帮助用户更直观、更快速地安装管理数据库插件。 本文分享自华为云社区《PostgreSQL插件那么多,怎样管理最高效?》,作者:GaussDB 数据库。 云服务环境下,如何让客户更方

MyBatis-Plus 实现多租户管理的实践

本文主要讲解使用Mybatis-Plus结合dynamic-datasource来实现多租户管理 在现代企业应用中,多租户(Multi-Tenant)架构已经成为一个非常重要的设计模式。多租户架构允许多个租户共享同一应用程序实例,但每个租户的数据彼此隔离。实现这一点可以大大提高资源利用率并降低运营成

[转帖]redis内存限制管理--maxmemory和maxmemory-policy

https://www.cnblogs.com/zgxblog/p/14198543.html 作为内存数据库,为了防止redis占用过多的内存对其他的应用程序造成影响,可以在redis.conf文件中通过设置maxmemory选项对redis所能够使用的最大内存做限制,并通过maxmemory_p

Linux磁盘管理

磁盘管理 【1】、Linux常用的分区格式 在新增磁盘后要对其进行分区,分区后才可以去存储数据 MBR分区格式:比较古老的分区格式,只能划分4个主分区,如果四个分区划分完成后,硬盘空间还有剩余,那剩余的分区也不能够使用。后来新增加扩展分区(容器)功能,可在扩展分区内划分出更多的逻辑分区,最大支持2.

[转帖]Oracle 通过 Exadata 云基础设施 X9M 提供卓越的数据库性能和规模

https://www.modb.pro/db/397202 32个节点的RAC 服务器 每个服务器 两个 64核心的AMD CPU 四个线程干管理 252个线程进行数据库处理 252*32=8064 Exadata Cloud Infrastructure X9M 以相同的价格比上一代产品多 2.

数字化时代,校园生活还可以这样过

摘要:今日校园携手华为云数据库联合打造稳定高效的数据底座服务,基于云原生数据库GaussDB(for Cassandra) 提供的超强读写、弹性扩展、便捷管理等能力,高效支撑业务稳定运行。 随着信息技术的发展,移动校园APP走入万千高校,不仅为广大师生提供了高效便捷的校园服务,也为校园生活增添了更多

对象业务的追加写接口

类似文件的追加写操作,在对象的末尾增加新的数据内容。 本文有如下假定: 对象存储服务基于文件语义实现。 使用PUT方式上传的对象,内部使用一个文件和对应的元数据来承载。 使用多段方式上传的对象,内部使用多个段文件、元数据来承载,其中每个段文件可管理独有的元数据。 下面讨论追加写操作时的方案和注意事项