【发布时间】:2021-04-24 00:29:31
【问题描述】:
在我的应用程序中,我有需要访问数据库的多线程,并且我使用 apache.tomcat.jdbc.pool.DataSource 作为 JDBC 连接池。
在某些情况下,用户在执行另一个查询以检索某些数据之前执行可能会影响数据库会话上下文/变量的存储过程。
线程完成后,连接关闭,但池连接的工作方式,连接并没有真正关闭,而是返回到连接池以供重用。问题类似于question这个问题。
问题是这些变量通常会影响从数据库中检索到的数据。因此,当另一个线程获取设置了这些变量/上下文的连接,然后查询数据库时,检索到的数据会受到上下文/变量的影响。
处理此类问题的最佳方法是什么?我概述了一些解决方案,但不确定哪个是最佳实践,而不是如何全部实施?
在将连接释放回池之前,执行重置会话/变量的过程/语句: 这个解决方案可以工作,但问题是我的应用程序使用不同的数据库。目前支持 MySQL 和 Oracle。对于 Oracle,我们有 RESET_PACKAGE 过程,但对于 MySQL 没有等价物。有没有办法在 MySQL 中做到这一点?还有如果支持新的数据库呢?
有没有办法强制或显式关闭实际/物理连接,而不是将其返回到池中? 或者是否有一个属性可以强制池关闭连接?
回滚到保存点是否会恢复数据库会话变量/上下文?
Savepoint savepoint = connection.setSavepoint();
// execute some procedure connection that affect session
connection.rollback(savepoint);
connection.close();
或者有没有其他方法可以强制清除会话或重新启动/关闭实际连接?
我的问题与这个question有关。
【问题讨论】:
-
您可以编写一个存储过程来重置 MySQL 上的会话变量。
-
@PiotrP.Karwasz 是的,一个可能的解决方案是编写一个过程来恢复更改会话值的过程。但这个想法是有一个通用的方法来做到这一点。即重置所有会话变量/上下文的过程。有没有预定义的mysql程序?
标签: java mysql oracle multithreading connection-pooling