java - 数据库 session 上下文中的更改随着池连接的重用而持续存在

标签 java mysql oracle multithreading connection-pooling

在我的应用程序中,我具有需要访问数据库的多线程,并且我将apache.tomcat.jdbc.pool.DataSource用作JDBC连接池。
在某些情况下,用户在执行另一个查询以检索某些数据之前执行可能会影响数据库 session 上下文/变量的存储过程。
线程完成后,连接关闭,但是池化连接的工作方式实际上并未关闭连接,而是返回到连接池以供重用。问题类似于这个问题question
问题在于这些变量通常会影响从数据库检索的数据。因此,当另一个线程获取设置了这些变量/上下文的连接,然后查询数据库时,检索到的数据将受到上下文/变量的影响。
解决此类问题的最佳方法是什么?我已经概述了一些解决方案,但是不确定哪种是最佳实践,而不是如何全部实现?
执行一个过程/语句,以重置 session /变量,然后再将连接释放回池:
此解决方案可能有效,但问题是我的应用程序使用其他数据库。目前,支持MySQL和Oracle。对于Oracle,我们有RESET_PACKAGE过程,但是MySQL没有等效的过程。有没有办法在MySQL中做到这一点?如果支持新数据库又该怎么办?
是否有一种方法可以强制或显式关闭实际/物理连接,而不仅仅是将其返回到池中? 或是否存在用于强制池以关闭连接的属性?
是否回滚到保存点会还原数据库 session 变量/上下文?

Savepoint savepoint = connection.setSavepoint();
// execute some procedure connection that affect session
connection.rollback(savepoint);
connection.close();
还是有其他方法可以强制清除 session 或重新启动/关闭实际连接?
我的问题与此question有关。

最佳答案

在MySQL上,您可以执行以下步骤:

BEGIN;
COMMIT RELEASE;
作为您的validationQueryRELEASE部分断开当前 session 的连接并创建一个新 session (请参阅MySQL Documentation)。

关于java - 数据库 session 上下文中的更改随着池连接的重用而持续存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65796032/

相关文章:

java - 64 位 JVM 限制为 300GB 内存?

java - 如何从Spring boot连接到H2控制台?

java - 我的 JRadioButton 在我运行时不显示,但当我单击该区域时它会显示

java - 如何从 JSP 页面调用 servlet 来执行自动重定向?

mysql - 限制查询之间的行比较

c# - 仅当上下文使用关系数据库提供程序时才能使用特定于关系的方法?

sql - 使用连接从 Oracle 表中选择 4 个最新行

php - 计数未在查询中返回正确的计数

mysql - 将 varchar 转换为整数

oracle - 在oracle 11G中自动删除最旧的分区