我有一个用 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/