在对 Spring Boot REST API 的多次调用中使用相同的 JDBC 连接
Using the same JDBC connection across multiple calls to Spring Boot REST API
我在 Java/Spring boot 和 运行 Tomcat 9.
中编写了一个 REST Web 服务
我需要在一个 Web 服务调用中创建一个 MySQL 临时 table 并稍后在另一个服务调用中访问它。由于临时 table 是连接范围的,我需要在第二次调用的“select”查询中的第一次调用中使用用于创建 table 的相同连接。
问题是 Tomcat 管理连接池中的 JDBC 个连接。在第二次服务调用中,每当我创建一个 JDBC 连接时,都可以从池中获取任何连接。在这种情况下,临时 table 将不可见。
我的问题是:如何从连接池中挑选相同的连接?有什么区分它们的id/tag吗?
即使您可以确保在后续请求中使用“相同”连接也无济于事,因为从池中分配连接的一部分涉及重置与会话状态相关的内容。
这是设计使然,这是一件好事,否则您可能会将私人数据从一个数据库会话泄漏到另一个不相关的会话。这将是一个问题,例如,如果一个用户将一些敏感数据存储在临时 table 中,然后另一个用户的数据库会话可以读取该临时 table。对于未完成的事务、会话变量和连接字符集之类的事情也是如此。当池分配连接时,所有这些都会重置。
因此,如果您使用临时 tables,您应该只在同一请求期间使用它们,因为当您使用完该连接后它们将被删除。
如果您需要将一个请求的数据用于下一个请求,您可以:
- 将数据存储在 non-temporary table.
- 将数据存储在缓存中。
- 在 Java 中编写后台服务来处理数据,因此您有代码创建和使用 temp tables,运行 与请求异步。这需要做更多的工作,对于一个简单的 Web 应用程序来说可能有点矫枉过正,但在某些服务中它是最佳解决方案。
我在 Java/Spring boot 和 运行 Tomcat 9.
中编写了一个 REST Web 服务我需要在一个 Web 服务调用中创建一个 MySQL 临时 table 并稍后在另一个服务调用中访问它。由于临时 table 是连接范围的,我需要在第二次调用的“select”查询中的第一次调用中使用用于创建 table 的相同连接。
问题是 Tomcat 管理连接池中的 JDBC 个连接。在第二次服务调用中,每当我创建一个 JDBC 连接时,都可以从池中获取任何连接。在这种情况下,临时 table 将不可见。
我的问题是:如何从连接池中挑选相同的连接?有什么区分它们的id/tag吗?
即使您可以确保在后续请求中使用“相同”连接也无济于事,因为从池中分配连接的一部分涉及重置与会话状态相关的内容。
这是设计使然,这是一件好事,否则您可能会将私人数据从一个数据库会话泄漏到另一个不相关的会话。这将是一个问题,例如,如果一个用户将一些敏感数据存储在临时 table 中,然后另一个用户的数据库会话可以读取该临时 table。对于未完成的事务、会话变量和连接字符集之类的事情也是如此。当池分配连接时,所有这些都会重置。
因此,如果您使用临时 tables,您应该只在同一请求期间使用它们,因为当您使用完该连接后它们将被删除。
如果您需要将一个请求的数据用于下一个请求,您可以:
- 将数据存储在 non-temporary table.
- 将数据存储在缓存中。
- 在 Java 中编写后台服务来处理数据,因此您有代码创建和使用 temp tables,运行 与请求异步。这需要做更多的工作,对于一个简单的 Web 应用程序来说可能有点矫枉过正,但在某些服务中它是最佳解决方案。