【问题标题】:Spring Boot DB connection release modeSpring Boot DB连接释放方式
【发布时间】:2021-02-07 15:46:14
【问题描述】:

Spring Boot中是否有控制数据库连接释放策略的方法?类似于 Hibernate 的ConnectionReleaseMode

我的测试代码大致如下:

  1. 插入查询
  2. HTTP 调用
  3. 更新查询

INSERT 和 UPDATE 查询是它们自己在存储库 bean 中的方法(扩展 CrudRepository 或作为 Mybatis @Mapper)。 HTTP 调用在它自己的 bean 中。

现在我的服务 bean 是我尝试不同 @Transactional 设置的地方,因为我的最终目标是在单个事务中执行这三个步骤。

问题是,HTTP 调用可能需要数百毫秒,而 Spring 在此期间保持数据库连接。这很快会导致连接池为空,而连接本身则处于空闲状态。

我使用spring-boot-starter-data-jpamybatis-spring-boot-starter 对默认配置进行了相同的实验。

唯一让我更接近目标的是将spring.jpa.open-in-view=false 设置为data-jpa,这将在完全不使用@Transactional 或传播设置为NEVER 的情况下释放数据库连接。但是,如果它全部包裹在一个事务中,它就行不通了。

我觉得我错过了 Spring 中事务概念的一些重要部分。虽然 Spring reference docs mentions release mode 仅与 JTA 事务管理器 + JEE 容器 + Hibernate 有关。

【问题讨论】:

    标签: spring spring-boot hibernate jpa spring-mybatis


    【解决方案1】:

    事务绑定到连接/会话,因此您不能在事务中间释放连接。您必须完成事务才能关闭/释放连接。请记住,事务可以随时中止,并且由于 HTTP 调用不是事务的“一部分”,而只是在事务进行时运行,因此它不会帮助您在 HTTP 期间保持事务打开通话正在运行。我建议您使用以下解决方案之一:

    1. 如果 HTTP 调用超时,请使用断路器取消 HTTP 调用,以获得连接/事务可以打开/保持多长时间的上限
    2. 在事务之前或之后将 HTTP 调用移出事务
    3. 使用两个数据库事务

    请注意,您可以使用事务性作业调度程序在第一个 TX 中安排作业。然后,该作业可以使用至少一次语义尝试调用 HTTP 调用,然后继续执行第二个事务,或者在出现故障时进行一些补偿。

    【讨论】:

      猜你喜欢
      • 2019-10-02
      • 2022-01-23
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 2017-06-06
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多