使用Spring @Transactional进行数据源路由
卡尔·帕帕(Carl Papa)在Spring框架中使用方面来确定要使用的DataSource
(读写或只读)启发了我。 所以,我正在写这篇文章。
我必须承认,我对Spring的AbstractRoutingDataSource
早已熟悉。 但是我不知道在哪里可以使用它。 感谢卡尔和团队,以及他们的项目之一。 现在,我知道了一个很好的用例。
@交易
在Spring中,只读事务通常带有注释。
public class ... {@Transactional(readOnly=true)public void ...() {...}@Transactional // read-writepublic void ...() {...}
}
为了利用这一点,我们使用Spring的TransactionSynchronizationManager
来确定当前事务是否为只读。
AbstractRoutingDataSource
在这里,如果当前事务是只读的,我们使用Spring的AbstractRoutingDataSource
路由到只读副本。 否则,它将路由到默认主机。
public class ... extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {if (TransactionSynchronizationManager.isCurrentTransactionReadOnly() ...) {// return key to a replica}return null; // use default}...
}
使用上述方法后,我们发现TransactionSynchronizationManager
落后了一步,因为Spring 在建立同步之前已经调用了DataSource.getConnection()
。 因此, LazyConnectionDataSourceProxy
需要配置LazyConnectionDataSourceProxy
。
在讨论这个问题时,我们发现是否存在另一种方法来确定当前事务是否为只读(无需使用LazyConnectionDataSourceProxy
)。 因此,我们提出了一种实验方法,其中一个方面将TransactionDefinition
(来自@Transactional
批注,如果有的话)捕获为线程局部变量,以及一个AbstractRoutingDataSource
根据捕获的信息进行路由。
相关源代码可以在GitHub上找到 。 再次感谢, 卡尔 ! 顺便说一句, 卡尔也是获奖电影导演。 哇,才华横溢。
翻译自: https://www.javacodegeeks.com/2018/01/datasource-routing-spring-transactional.html
使用Spring @Transactional进行数据源路由相关推荐
- Spring @Transactional (一)
Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...
- 自己动手写一个分库分表中间件(三)数据源路由实现
相关文章: 自己动手写一个分库分表中间件(一)思考 自己动手写一个分库分表中间件(二)数据源定义和分片代理层设计 排查项目中读写分离失效原因 小议 Java 内省机制 注:本文内容暂不涉及事务相关的问 ...
- Spring Boot与数据访问
Spring Boot与数据访问 JBDC.MyBatis.Spring Data JPA 一.简介 对于数据访问层,无论是SQL还是NOSQL,Spring Boot默认采用整合 Spring Da ...
- How does Spring @Transactional Really Work?--转
原文地址:http://blog.jhades.org/how-does-spring-transactional-really-work/ In this post we will do a dee ...
- Spring Boot - 构建数据访问层
文章目录 基础规范: JDBC 关系型数据库访问规范 JDBC 规范中的核心编程对象 DriverManager DataSource Connection Statement/PreparedSta ...
- 事务之五:Spring @Transactional工作原理
本文将深入研究Spring的事务管理.主要介绍@Transactional在底层是如何工作的. JPA(Java Persistence API--java持久层)和事务管理 很重要的一点是JPA本身 ...
- 使用Spring JDBC进行数据访问 (JdbcTemplate/NamedParameterJdbcTemplate/SimpleJdbcTemplate/SimpleJdbcCall/Stor)
http://www.cnblogs.com/webcc/archive/2012/04/11/2442680.html 使用Spring JDBC进行数据访问 11.1. 简介 Spring JDB ...
- spring(13)缓存数据
[0]README 1)本文部分文字描述转自:"Spring In Action(中/英文版)",旨在review "spring(13)缓存数据" 的相关知 ...
- spring可用于数据层吗_Spring XD用于数据提取
spring可用于数据层吗 Spring XD是一个功能强大的工具,它是一组可安装的Spring Boot服务,可以独立运行,在YARN或EC2之上运行. Spring XD还包括一个管理UI网站和一 ...
最新文章
- java 添加联系人,java – 如何将联系人添加到组android
- linux 查看语言环境_Linux语言环境版本查看shell脚本
- 腾讯云 wdcp ip:8080打不开,wdcp phpmyadmin打不开
- linux下git分支管理,git远程分支管理
- Android 蓝牙开发浅析
- android应用APP中的页面响应时间测试
- SAP OData service的执行是如何从Gateway系统转交到backend系统
- java string转jsonobject_超赞!终于有网友用Java实现了第三方qq账号登录
- python png 背景透明_python – Pygame:在png图像中将所有白色像素转换为完全透明...
- 定时任务crontab
- Github | 谷歌机器学习课程中文版
- mysql 5.720安装_MySQL 5.7.27下载安装配置的详细教程
- CF16E Fish(状压+期望dp)
- unity 更换standard shader
- linux man 位置,Linux系统如何查看命令帮助,man命令使用详解
- 互联网医疗仅剩的平台型超级独角兽,微医如何冲出重围?
- 230个形容人性格的英语词汇
- 怎么解log方程_对数方程的解法
- CSDN博客界面自定义之右侧博客栏目修改
- position:sticky 粘性定位 (sticky) 与 固定定位