使用 Spring @Transactional 进行数据源路由详解

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(84)   2024-05-28 16:20:08

Carl Papa 在 Spring 框架中使用方面来确定要使用的 DataSource(读写或只读),这启发了我。所以,我正在写这篇文章。

我必须承认,我早就熟悉 Spring 的 AbstractRoutingDataSource。但是我不知道在哪里可以使用它。感谢 Carl 和团队,以及他们的一个项目。现在,我知道一个很好的用例。

@事务性

使用 Spring,只读事务通常用注释标记。

public class ... {
    @Transactional(readOnly=true)
    public void ...() {...}

    @Transactional // read-write
    public void ...() {...}
}

为了利用这一点,我们使用 Spring 的 TransactionSynchronizationManager 来确定当前事务是否是只读的。

抽象路由数据源

在这里,如果当前事务是只读的,我们使用 Spring 的 AbstractRoutingDataSource 路由到只读副本。否则,它会路由到默认主机。

public class ... extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        if (TransactionSynchronizationManager
                .isCurrentTransactionReadOnly() ...) {
            // return key to a replica
        }
        return null; // use default
    }
    ...
}

使用上述方法后,我们发现 TransactionSynchronizationManager 落后了一步,因为在建立同步之前 Spring 已经调用了 DataSource.getConnection() 。因此,还需要配置 LazyConnectionDataSourceProxy

在讨论这个问题时,我们想知道是否有另一种方法可以确定当前事务是否是只读的(无需求助于 LazyConnectionDataSourceProxy)。因此,我们提出了一种实验性方法,其中一个方面捕获 TransactionDefinition(来自 @Transactional 注释,如果有的话)作为线程局部变量,以及一个 AbstractRoutingDataSource 根据捕获的信息进行路由。

相关源码可以在GitHub上找到。再次感谢 Carl!顺便说一句,Carl 也是一位屡获殊荣的电影导演。哇,人才绝对是无国界的。

标签2: Java教程 Spring
地址:https://www.cundage.com/article/jcg-datasource-routing-spring-transactional.html

相关阅读

之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
学习Spring Boot有以下深度教程,涵盖从基本概念到打包、部署、监控等高级概念。 1. 开始 Spring Boot 简介 spring-boot-starter-parent 示例 sp...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
在spring boot中登录非常灵活,易于配置。 Spring Boot 通过简单的配置支持各种日志记录提供程序。在本教程中,我们将了解 Spring boot 支持的各种日志记录选项和配置。...
Spring Boot Groovy CLI 教程是使用命令行界面的 Spring Boot 框架的介绍性教程。在本教程中,我们使用 Groovy 语言。 春天 是一个流行的 Java 应用程序...
Spring Boot Thymeleaf 配置教程展示了如何使用 Spring Boot Web 应用程序配置 Thymeleaf。当 Spring Boot 在 Maven POM 文件中发...
Spring Boot GenericApplicationContext 教程展示了如何在 Spring 应用程序中使用 GenericApplicationContext。在示例中,我们创建...
Spring Framework 是由于 Java 社区对早期版本的 Enterprise Java 感到失望而创建的。从那时起,它已经发展成为一个巨大的生态系统,可以解决构建基于 Web 的 ...
在此 Spring boot 教程 中,学习使用其内置支持来管理应用程序缓存。大多数缓存功能都是自动配置的,需要很少或不需要配置。 缓存是一种提高系统性能的机制。它是位于应用程序和持久数据库之间...
Spring Boot @Component 教程展示了如何在 Spring 应用程序中使用 @Component 注释。在示例中,我们创建了一个 Spring Boot 控制台应用程序。 春天...