java - 在对 Spring Boot REST API 的多次调用中使用相同的 JDBC 连接

标签 java mysql spring spring-boot jdbc

我有一个用 Java/Spring boot 编写并在 Tomcat 9 上运行的 REST Web 服务。

我需要在一个 Web 服务调用中创建一个 MySQL 临时表,并稍后在另一个服务调用中访问它。由于临时表是连接范围的,因此我需要在第二次调用的“select”查询中使用第一次调用期间用于创建表的相同连接。

问题在于 Tomcat 在连接池中管理 JDBC 连接。在第二个服务调用中,每当我创建 JDBC 连接时,都可以从池中选取任何连接。在这种情况下,临时表将不可见。

我的问题是:如何从连接池中选取相同的连接?是否有任何类型的 ID/标签可以区分它们?

最佳答案

即使您可以确保在后续请求中使用“相同”连接也无济于事,因为从池中分配连接的一部分涉及重置与 session 状态相关的内容。

这是设计使然,这是一件好事,因为否则您可能会将私有(private)数据从一个数据库 session 泄漏到另一个不相关的 session 。例如,如果一个用户将一些敏感数据存储在临时表中,然后该临时表可由另一用户的数据库 session 读取,这将是一个问题。对于未完成的事务、 session 变量和连接字符集等也是如此。当池分配连接时,所有这些都会重置。

因此,如果您使用临时表,则应该仅在同一请求期间使用它们,因为当您使用完该连接后,它们将被删除。

如果您需要使用一个请求到下一个请求的数据,您可以:

  • 将数据存储在非临时表中。
  • 将数据存储在缓存中。
  • 用 Java 编写后台服务来处理数据,这样您就可以使用代码创建和使用临时表,并与请求异步运行。这是一项繁重的工作,对于一个简单的网络应用程序来说可能有点大材小用,但在某些服务中它是最佳解决方案。

关于java - 在对 Spring Boot REST API 的多次调用中使用相同的 JDBC 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71442324/

相关文章:

java - Eclipse Maven 项目无法解析依赖项

mysql - 如何避免Sphinx索引中的列重复?

php - 授予mysql远程访问权限

java - 使用 spring 集成复制文件

java - org.modelmapper 中的标记化

java - Fitnesse : "could not detect death of command line test runner"

java - 使用 TPM 连接到 Azure Iot Hub

java - 实时数据提取/交易捕获

mysql - HAVING 子句如何真正起作用?

java - 了解为什么即使在 onDispatchTouchEvent() 返回 True 后仍会调用 onClick()