当前位置: 首页 > 知识库问答 >
问题:

在spring-data-jpa和spring-security-oauth的JdbcTokenStore之间共享Jdbc连接池时,如何处理事务?

陶星波
2023-03-14

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

Jdbc默认为自动提交模式,而JdbcTokenStore似乎是在自动提交启用的假设下编写的。它从未明确提交更改。

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

我们正在观察以下问题:

  • 请求(1):客户端获得访问令牌。JdbcTokenStore将其插入数据库

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

我不太熟悉Spring的内部结构。是否可能发生以下情况?

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

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

共有1个答案

哈栋
2023-03-14

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

 类似资料:
  • 最近,我注意到Spring Data JDBC,所以我决定在一个新的Spring Boot(2.3.1)应用程序中使用它。在我的用例中,我有一个包含两类表的DB模式: 用于存储应用程序(更复杂的)业务逻辑所使用的实体的表。我使用Spring Data JPA(带有底层Hibernate)来处理它们。 表,用于存储彼此之间没有太多关系的简单数据记录(例如来自外部系统的数据记录)。我决定对它们使用Sp

  • 这里是Spring Boot。我目前在我的所有JPA实体中使用JPA/Hibernate以及接口,到目前为止它一直对我很有用。我需要执行一个需要的复杂查询,据我所知,Hibernate不支持联合(或者至少不容易支持它们)。我已经通过在我的中尝试了十几个不同的JPQL查询进行了验证,所有这些查询都失败了,因为Hibernate(JPA提供程序)不喜欢。 因此,在这一种情况下,我完全可以使用原始JDB

  • 我们在应用程序中使用了Hibernate/JPA、Spring、Spring Data和Spring Security。我有一个标准的实体,它是使用JPA映射的。此外,我还有一个 它遵循Spring数据约定来命名查询方法。我有一个实体 如何避免这种递归?是否有“规范的方式”来加载实体?或者有没有一种方法可以防止Hibernate/JPA冲洗?

  • 问题内容: 我只有一个数据源,我使用Spring 3.0.3,Hibernate 3.5.1作为JPA提供程序,并且使用MyBatis 3.0.2进行某些查询,并且我的应用程序在Tomcat 6上运行。当我同时调用HibernateDAO和MyBatisDAO时,从@Transactional注释的同一方法中,它们似乎不共享同一事务,它们获得了不同的连接。 我该怎么做? 我尝试从DataSourc

  • 问题内容: 我在Web应用程序中使用spring-boot,并使用spring- jpa从数据库中读取/写入数据库。它工作得很好,但是我想了解如何管理数据库连接。以下是我的数据库属性配置: 我已将最大连接数设置为500。当用户在我的spring应用程序上发出请求时,将为他打开数据库连接。完成请求后,spring jpa会关闭此连接吗?如果没有,它将何时关闭未使用的连接? 我已经阅读了http://

  • 我从http://docs.spring.io/spring-data/jpa/docs/current/reference/html/阅读了spring jpa参考文档。但它没有提到任何关于联系的事情。