卡尔·帕帕(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进行数据源路由相关推荐

  1. Spring @Transactional (一)

    Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...

  2. 自己动手写一个分库分表中间件(三)数据源路由实现

    相关文章: 自己动手写一个分库分表中间件(一)思考 自己动手写一个分库分表中间件(二)数据源定义和分片代理层设计 排查项目中读写分离失效原因 小议 Java 内省机制 注:本文内容暂不涉及事务相关的问 ...

  3. Spring Boot与数据访问

    Spring Boot与数据访问 JBDC.MyBatis.Spring Data JPA 一.简介 对于数据访问层,无论是SQL还是NOSQL,Spring Boot默认采用整合 Spring Da ...

  4. How does Spring @Transactional Really Work?--转

    原文地址:http://blog.jhades.org/how-does-spring-transactional-really-work/ In this post we will do a dee ...

  5. Spring Boot - 构建数据访问层

    文章目录 基础规范: JDBC 关系型数据库访问规范 JDBC 规范中的核心编程对象 DriverManager DataSource Connection Statement/PreparedSta ...

  6. 事务之五:Spring @Transactional工作原理

    本文将深入研究Spring的事务管理.主要介绍@Transactional在底层是如何工作的. JPA(Java Persistence API--java持久层)和事务管理 很重要的一点是JPA本身 ...

  7. 使用Spring JDBC进行数据访问 (JdbcTemplate/NamedParameterJdbcTemplate/SimpleJdbcTemplate/SimpleJdbcCall/Stor)

    http://www.cnblogs.com/webcc/archive/2012/04/11/2442680.html 使用Spring JDBC进行数据访问 11.1. 简介 Spring JDB ...

  8. spring(13)缓存数据

    [0]README 1)本文部分文字描述转自:"Spring In Action(中/英文版)",旨在review  "spring(13)缓存数据" 的相关知 ...

  9. spring可用于数据层吗_Spring XD用于数据提取

    spring可用于数据层吗 Spring XD是一个功能强大的工具,它是一组可安装的Spring Boot服务,可以独立运行,在YARN或EC2之上运行. Spring XD还包括一个管理UI网站和一 ...

最新文章

  1. java 添加联系人,java – 如何将联系人添加到组android
  2. linux 查看语言环境_Linux语言环境版本查看shell脚本
  3. 腾讯云 wdcp ip:8080打不开,wdcp phpmyadmin打不开
  4. linux下git分支管理,git远程分支管理
  5. Android 蓝牙开发浅析
  6. android应用APP中的页面响应时间测试
  7. SAP OData service的执行是如何从Gateway系统转交到backend系统
  8. java string转jsonobject_超赞!终于有网友用Java实现了第三方qq账号登录
  9. python png 背景透明_python – Pygame:在png图像中将所有白色像素转换为完全透明...
  10. 定时任务crontab
  11. Github | 谷歌机器学习课程中文版
  12. mysql 5.720安装_MySQL 5.7.27下载安装配置的详细教程
  13. CF16E Fish(状压+期望dp)
  14. unity 更换standard shader
  15. linux man 位置,Linux系统如何查看命令帮助,man命令使用详解
  16. 互联网医疗仅剩的平台型超级独角兽,微医如何冲出重围?
  17. 230个形容人性格的英语词汇
  18. 怎么解log方程_对数方程的解法
  19. CSDN博客界面自定义之右侧博客栏目修改
  20. position:sticky 粘性定位 (sticky) 与 固定定位

热门文章

  1. PL/SQL之JOB用法 (定时跑数据)
  2. 线程间协作的两种方式:wait、notify、notifyAll和Condition
  3. 44个Java代码性能优化总结
  4. uni-app打包h5
  5. git创建tag标签
  6. Oracle数据库基本概念理解(1)
  7. java生成验证码并进行验证
  8. 检测性异常VS非检测性异常
  9. 如何在Intellij IDEA中集成Gitlab
  10. controller属于哪一层_别急着换5G,4G手机同样值得考虑!哪几款安卓手机称得上4G机皇?...