【问题标题】:When sharing a Jdbc connection pool between spring-data-jpa and spring-security-oauth's JdbcTokenStore, how to handle transactions?spring-data-jpa和spring-security-oauth的JdbcTokenStore共享一个Jdbc连接池时,如何处理事务?
【发布时间】:2017-03-26 21:26:14
【问题描述】:

我们正在使用 spring-security 中的 JdbcTokenStore 来持久化 oAuth2 访问令牌。同一个应用程序也严重依赖 spring-data-jpa。两者共享一个到 MySQL 数据库的连接池。

Jdbc 默认为自动提交模式,并且 JdbcTokenStore 似乎是在假设自动提交打开的情况下编写的。它从不明确提交更改。

另一方面,Spring-data 和 JPA 需要一个事务来进行写操作。应用程序使用@Transactional 注释。

我们正在观察以下问题:

  • 请求 (1):客户端获取访问令牌。 JdbcTokenStore 将其插入到数据库中。
  • 请求(2):然后,客户端在后续请求中使用此访问令牌。此请求被拒绝,因为在数据库中找不到令牌。

如果来自请求 (1) 的事务尚未提交,则可以解释此行为。

我对 Spring 的内部结构不是很熟悉。会不会出现以下情况?

  • 某些 JPA 操作从池中获取 JDBC 连接 #1,设置 auto-commit=off,执行任意数量的 SQL 语句,然后提交。
  • 请求 (1):JdbcTokenStore 获取相同的 JDBC 连接 #1,执行 INSERT 语句。 (这现在发生在事务中。这没有提交。)
  • 请求 (2):JdbcTokenStore 获取不同的 JDBC 连接 #2,执行 SELECT 语句。 (这不会看到未提交的事务。)
  • 某些 JPA 操作再次获取 JDBC 连接 #1 并提交。 (现在 oAuth 令牌已提交。)

什么配置可以避免这种情况?

【问题讨论】:

    标签: spring jdbc spring-security spring-data spring-data-jpa


    【解决方案1】:

    虽然我无法解释根本原因,但我们找到了解决方法:切换到 HikariCP JDBC 连接池(替换 Tomcat)消除了描述问题的所有症状。

    【讨论】:

      猜你喜欢
      • 2020-10-08
      • 1970-01-01
      • 2017-10-16
      • 2013-08-26
      • 2011-10-10
      • 1970-01-01
      • 2017-12-23
      • 2023-04-08
      • 2017-07-17
      相关资源
      最近更新 更多