首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用spring @Transactional和AbstractRoutingDataSource在只读和读写数据库之间切换

Spring的@Transactional注解用于声明事务的作用范围,而AbstractRoutingDataSource则是Spring提供的用于在多个数据源之间动态切换的抽象类。

使用@SpringbootTransactional和AbstractRoutingDataSource可以在只读和读写数据库之间进行切换。

具体步骤如下:

  1. 首先,配置多个数据源。可以使用Spring的配置文件或注解的方式进行配置。假设我们有一个只读数据源和一个读写数据源。
  2. 创建一个继承自AbstractRoutingDataSource的动态数据源类。重写determineCurrentLookupKey()方法,该方法决定当前使用哪个数据源。可以根据业务逻辑来判断使用只读数据源还是读写数据源。
  3. 在Spring的配置文件中配置事务管理器。使用Spring的事务管理器来管理事务,并指定使用的数据源。
  4. 在需要进行事务管理的方法上添加@Transactional注解。可以根据需要指定事务的传播行为和隔离级别。
  5. 在需要读写切换的地方,使用@Primary注解标注读写数据源。

这样,当需要读取数据时,数据源会被切换为只读数据源,而在需要写入数据时,数据源会被切换为读写数据源。

使用Spring的@Transactional和AbstractRoutingDataSource可以实现在只读和读写数据库之间的切换,优化读取性能,提高系统的稳定性和可靠性。

腾讯云相关产品推荐:

  • 云数据库 TencentDB:提供高性能、可扩展的数据库服务,支持MySQL、SQL Server、MongoDB等多种数据库引擎。链接地址:https://cloud.tencent.com/product/tencentdb
  • 云服务器 Tencent Cloud Virtual Machine (CVM):提供安全可靠、灵活扩展的云服务器,适用于各种应用场景。链接地址:https://cloud.tencent.com/product/cvm
  • 云函数 Tencent Cloud Function (SCF):基于事件驱动的无服务器计算服务,帮助开发者快速构建和运行代码,实现按需计算。链接地址:https://cloud.tencent.com/product/scf
  • 云存储 Tencent Cloud Object Storage (COS):提供安全、可靠的大规模数据存储服务,支持多种数据类型和协议。链接地址:https://cloud.tencent.com/product/cos
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SpringBoot 2.0 教程实战 MySQL 读写分离

引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。...然而,应用程序层面去做读写分离最大的弱点(不足之处)在于无法动态增加数据库节点,因为数据源配置都是写在配置中的,新增数据库意味着新加一个数据源,必然改配置,并重启应用。当然,好处就是相对简单。 ?...AbstractRoutingDataSource 基于特定的查找key路由到特定的数据源。它内部维护了一组目标数据源,并且做了路由key与目标数据源之间的映射,提供基于key查找数据源的方法。 ?...容器中现在有4个数据源,所以我们需要为事务管理器MyBatis手动指定一个明确的数据源。...设置路由key / 查找数据源 目标数据源就是那前3个这个我们是知道的,但是使用的时候是如果查找数据源的呢?

67820
  • 剖析Spring多数据源

    1.2 读写分离 一些规模较小的公司,没有使用数据库访问层中间件。使用多数据源来实现简单的读写分离功能。 ? 这里的架构与上图类似。...不同的是,在读写分离中,主库从库的数据库是一致的(不考虑主从延迟)。数据更新操作(insert、update、delete)都是主库上进行,主库将数据变更信息同步给从库。...如果使用数据库访问层中间件,通常会有中间件来实现读写分离的逻辑,对业务更加透明。...另外,一点需要注意的是,事务中无法切换数据源。spring的@Transactional注解,无非一个切入点,spring会对添加了@Transactional注解方法的类进行代理。...2、@Routing注解spring提供的@Transactional注解,都需要对类进行代理,且前者需要在后者之前发挥作用。是使用二次代理?还是其他更优雅的方式

    1.8K10

    Spring主从数据库的配置动态数据源切换原理

    大型应用程序中,配置主从数据库使用读写分离是常见的设计模式。Spring应用程序中,要实现读写分离,最好不要对现有代码进行改动,而是底层透明地支持。...开发环境下,没有必要配置主从数据库。只需要给数据库设置两个用户,一个rw具有读写权限,一个ro只有SELECT权限,这样就模拟了生产环境下对主从数据库读写分离。...我们仔细想想,Spring提供的声明式事务管理,就只需要一个@Transactional()注解,放在某个Java方法上,这个方法就自动具有了事务。...想要在应用程序中少写代码,我们就得多做一点底层工作:必须使用类似Spring实现声明式事务的机制,即用AOP实现动态数据源切换。...此外,@RoutingWith@Transactional混用时,要设定AOP的优先级。 本文代码需要SpringBoot支持,JDK 1.8编译并打开-parameters编译参数。

    2.7K20

    SpringBoot+MyBatis+MySQL读写分离

    引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。...这里我们选择程序自己来做,主要是利用Spring提供的路由数据源,以及AOP 然而,应用程序层面去做读写分离最大的弱点(不足之处)在于无法动态增加数据库节点,因为数据源配置都是写在配置中的,新增数据库意味着新加一个数据源...AbstractRoutingDataSource 基于特定的查找key路由到特定的数据源。它内部维护了一组目标数据源,并且做了路由key与目标数据源之间的映射,提供基于key查找数据源的方法。...容器中现在有4个数据源,所以我们需要为事务管理器MyBatis手动指定一个明确的数据源。...设置路由key / 查找数据源 目标数据源就是那前3个这个我们是知道的,但是使用的时候是如果查找数据源的呢?

    53920

    SpringBoot + MyBatis + MySQL 读写分离实战

    引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。...然而,应用程序层面去做读写分离最大的弱点(不足之处)在于无法动态增加数据库节点,因为数据源配置都是写在配置中的,新增数据库意味着新加一个数据源,必然改配置,并重启应用。当然,好处就是相对简单。 ?...AbstractRoutingDataSource 基于特定的查找key路由到特定的数据源。它内部维护了一组目标数据源,并且做了路由key与目标数据源之间的映射,提供基于key查找数据源的方法。 ?...容器中现在有4个数据源,所以我们需要为事务管理器MyBatis手动指定一个明确的数据源。...设置路由key / 查找数据源 目标数据源就是那前3个这个我们是知道的,但是使用的时候是如果查找数据源的呢?

    60470

    Spring Boot MyBatis 动态数据源切换、多数据源,读写分离

    : master: 使用了多数据源的 RESTful API 接口,使用 Druid 实现了 DAO 层数据源动态切换只读数据源负载均衡 dev: 最简单的切面注解方式实现的动态数据源切换...druid: 通过切面注解方式实现的使用 Druid 连接池的动态数据源切换 aspect_dao: 通过切面实现的 DAO 层的动态数据源切换 roundrobin: 通过切面使用轮询方式实现的只读数据源负载均衡...使用的过程中基本踩遍了所有动态数据源切换的坑,将常见的一些坑和解决方法写在了 Issues 里面 该项目使用了一个可写数据源多个只读数据源,为了减少数据库压力,使用轮循的方式选择只读数据源;考虑到一个...Service 中同时会有读写的操作,所以本应用使用 AOP 切面通过 DAO 层的方法名切换只读数据源;但这种方式要求数据源主从一致,并且应当避免同一个 Service 方法中写入后立即查询,如果必须在执行写入操作后立即读取...表中的数据,同时也可以在看到切换数据源的 log,说明动态切换数据源是有效的 注意 该应用中因为使用了 DAO 层的切面切换数据源,所以 @Transactional 注解不能加在类上,只能用于方法

    1.8K50

    SpringBoot+MyBatis+MySQL读写分离实战

    引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。...这里我们选择程序自己来做,主要是利用Spring提供的路由数据源,以及AOP 然而,应用程序层面去做读写分离最大的弱点(不足之处)在于无法动态增加数据库节点,因为数据源配置都是写在配置中的,新增数据库意味着新加一个数据源...AbstractRoutingDataSource 基于特定的查找key路由到特定的数据源。它内部维护了一组目标数据源,并且做了路由key与目标数据源之间的映射,提供基于key查找数据源的方法。...容器中现在有4个数据源,所以我们需要为事务管理器MyBatis手动指定一个明确的数据源。...设置路由key / 查找数据源 目标数据源就是那前3个这个我们是知道的,但是使用的时候是如果查找数据源的呢?

    88820

    Spring Boot + MyBatis + MySQL 实现读写分离!

    来源 | https://www.cnblogs.com/cjsblog/p/9712457.html 1、引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿...这里我们选择程序自己来做,主要是利用Spring提供的路由数据源,以及AOP 然而,应用程序层面去做读写分离最大的弱点(不足之处)在于无法动态增加数据库节点,因为数据源配置都是写在配置中的,新增数据库意味着新加一个数据源...2、AbstractRoutingDataSource 基于特定的查找key路由到特定的数据源。它内部维护了一组目标数据源,并且做了路由key与目标数据源之间的映射,提供基于key查找数据源的方法。...容器中现在有4个数据源,所以我们需要为事务管理器MyBatis手动指定一个明确的数据源。...设置路由key / 查找数据源 目标数据源就是那前3个这个我们是知道的,但是使用的时候是如果查找数据源的呢?

    52920

    SpringBoot+MyBatis+MySQL读写分离实战

    引言 ---- 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。...这里我们选择程序自己来做,主要是利用Spring提供的路由数据源,以及AOP 然而,应用程序层面去做读写分离最大的弱点(不足之处)在于无法动态增加数据库节点,因为数据源配置都是写在配置中的,新增数据库意味着新加一个数据源...它内部维护了一组目标数据源,并且做了路由key与目标数据源之间的映射,提供基于key查找数据源的方法。 3....容器中现在有4个数据源,所以我们需要为事务管理器MyBatis手动指定一个明确的数据源。...设置路由key / 查找数据源 目标数据源就是那前3个这个我们是知道的,但是使用的时候是如果查找数据源的呢?

    41440

    SpringBoot+MyBatis+MySQL读写分离实战

    SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。...这里我们选择程序自己来做,主要是利用Spring提供的路由数据源,以及AOP 然而,应用程序层面去做读写分离最大的弱点(不足之处)在于无法动态增加数据库节点,因为数据源配置都是写在配置中的,新增数据库意味着新加一个数据源...2.AbstractRoutingDataSource 基于特定的查找key路由到特定的数据源。它内部维护了一组目标数据源,并且做了路由key与目标数据源之间的映射,提供基于key查找数据源的方法。...容器中现在有4个数据源,所以我们需要为事务管理器MyBatis手动指定一个明确的数据源。...3.3 设置路由key / 查找数据源 目标数据源就是那前3个这个我们是知道的,但是使用的时候是如果查找数据源的呢?

    37440

    数据库读写分离与事务纠缠的那点坑

    读写分离时会不会造成事务主从切换错误 一个线程Serivcie时Select时选择的是从库,DynamicDataSourceHolder中ThreadLocal对应线程存储的是slave,然后调用...事务管理器 Spring中通常通过@Transactional来声明使用事务。如果@Transactional不指定事务管理器,使用缺省。...transaction-manager属性保存一个对Spring配置文件中定义的事务管理器bean的引用,如果没有它,就会忽略@Transactional注释,导致代码不会使用任何事务。...注意@Transactional建议具体的类(或类的方法)上使用,不要使用在类所要实现的任何接口上。...(推荐阅读:数据库事务与MySQL事务总结 https://zhuanlan.zhihu.com/p/29166694) Q1 在读写分离时会不会造成事务主从切换错误 一个线程Serivcie时Select

    1.3K00

    SpringBoot+MyBatis+MySQL读写分离

    引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。...然而,应用程序层面去做读写分离最大的弱点(不足之处)在于无法动态增加数据库节点,因为数据源配置都是写在配置中的,新增数据库意味着新加一个数据源,必然改配置,并重启应用。当然,好处就是相对简单。 ?...AbstractRoutingDataSource 基于特定的查找key路由到特定的数据源。它内部维护了一组目标数据源,并且做了路由key与目标数据源之间的映射,提供基于key查找数据源的方法。 ?...容器中现在有4个数据源,所以我们需要为事务管理器MyBatis手动指定一个明确的数据源。...设置路由key / 查找数据源 目标数据源就是那前3个这个我们是知道的,但是使用的时候是如果查找数据源的呢?

    54720

    3种方式实现多数据源控制切换、实现读写分离;演示借助AbstractRoutingDataSource实现多数据源的动态切换代码【享学Spring

    下面为了方便分析,以典型的读写分离为例作为讲解~ 读写分离:主库master可读可写,从库slave是readOnly的且可以有多个。 为何数据库需要读写分离?...采用读写分离技术的目标:有效减轻Master库的压力,又可以把用户查询数据的请求分发到不同的Slave库(多个Slave之间也可实现负载均衡),从而保证整个系统的健壮性。...接下来介绍的这种方式是使用最广泛也是本文的主菜~~~ 方式三:AbstractRoutingDataSource动态切换数据源 基于三层的后端架构中,操作数据库的是Dao层。...因此下面继续介绍更加优雅的操作方式(自定义注解+AOP) 使用AOP+自定义注解方式优雅的实现数据源动态切换 为了实现更优雅的动态数据源的切换,我们可以使用Spring AOP+自定义注解的方式实现对方法级别的数据源切换...(具体JTA事务里再会详解) 另外,上面讲述的这些API都在spring-jdbc.jar里。 最后也留一个小悬念:多数据源切换是成功了,但牵涉到事务呢?

    8.8K52

    基于自定义注解Aop动态数据源配置

    基于自定义注解Aop动态数据源配置         实际项目中,经常会因为需要增强数据库并发能力而设计分库分表或者读写分离等策略,每在旧项目中引进新技术的时候都会带来一系列的问题,我们的目的就是去解决问题...配置pom.xml,使用的是阿里巴巴数据源包Mysql 5.1.30的驱动 <!...spring-dispatcher.xml依赖的config.properties配置文件如下: # =====================数据源切换数据masterslave数据库=======...基本核心配置核心代码已经如上了,那我们要怎么使用了,如spring-dispatcher.xml 配置中配置Aop的切点是service包下的所有方法。...同一个service方法中由于涉及到二个库的增删改查,但切换数据源注解是配置service方法上的,所以导致不能自动切换数据源,采用的手手动切换切换代码如下: DynamicDataSourceHolder.setDataSourceType

    1.4K70

    SpringBoot 多数据源及事务解决方案

    数据源切换原理 通过扩展Spring提供的抽象类AbstractRoutingDataSource,可以实现切换数据源。...3.3 方案不足 基于AbstractRoutingDataSource的多数据源动态切换,有个明显的缺点,无法动态添加删除数据源。我们的产品中,不能把应用数据源写死配置文件。...项目运行过程中,可以使用定时任务对数据源进行保活,为了提升性能再添加一层缓存。 AbstractRoutingDataSource 只支持单库事务,切换数据源是开启事务之前执行。...借助Spring的声明式事务处理,我们可以多次切库操作时强制开启新的事务: @SwitchDataSource     @Transactional(rollbackFor = Exception.class...1.提到Spring事务,就离不开事务的四大特性隔离级别、七大传播特性。 事务特性离级别是属于数据库范畴。Spring事务的七大传播特性是什么呢?

    52800

    SpringBoot 多数据源及事务解决方案

    数据源切换原理 通过扩展Spring提供的抽象类AbstractRoutingDataSource,可以实现切换数据源。...3.3 方案不足 基于AbstractRoutingDataSource的多数据源动态切换,有个明显的缺点,无法动态添加删除数据源。我们的产品中,不能把应用数据源写死配置文件。...项目运行过程中,可以使用定时任务对数据源进行保活,为了提升性能再添加一层缓存。 AbstractRoutingDataSource 只支持单库事务,切换数据源是开启事务之前执行。...借助Spring的声明式事务处理,我们可以多次切库操作时强制开启新的事务: @SwitchDataSource @Transactional(rollbackFor = Exception.class...1.提到Spring事务,就离不开事务的四大特性隔离级别、七大传播特性。 事务特性离级别是属于数据库范畴。Spring事务的七大传播特性是什么呢?

    1.1K31

    重学SpringBoot3-AbstractRoutingDataSource

    现代的应用开发中,尤其是 SaaS 多租户架构、读写分离、或者多数据源的场景下,通常需要动态地切换数据源。...这个机制特别适用于以下几种场景: 多租户架构:不同的租户需要访问不同的数据库或数据源。 读写分离:写操作使用主库,读操作使用从库。 多数据源:根据业务逻辑动态选择使用不同的数据库。 2....简化多数据源的管理:避免硬编码多个数据源,提供更灵活的动态数据源切换能力。 读写分离:通常在高并发的应用场景中,将写操作路由到主数据库,读操作路由到从数据库,从而提高系统性能可扩展性。 3....总结 AbstractRoutingDataSourceSpring Boot 3 中非常强大且灵活的工具,适合多租户、读写分离多数据源的场景。...通过它,我们可以应用中动态地选择不同的数据源,而无需手动切换,极大地提高了代码的灵活性可维护性。

    11910
    领券