【发布时间】:2016-12-28 03:45:04
【问题描述】:
我正在使用 MySQL 的 temporary tables 和 connection pooling。
通常,在会话中创建的临时表会保留在该会话中,并在连接关闭时被删除。但是,由于我正在使用连接池,并且在调用 java.sql.Connection.close() 时物理连接实际上并未关闭,因此我发现临时表仍然存在并影响下一个会话。
这会导致数据库上的资源泄漏,因为临时表没有立即释放,并且由于表名冲突而导致名称冲突。
直觉上,当我借用连接时,我期望一个干净的状态。如何做到这一点?
- 似乎没有与 MySQL 等效的 SQL Server's
sp_reset_connection。 - 即使有,我也看不到dbcp2 can be configured在连接返回时如何调用它。
- 返回池时始终关闭物理连接可以正常工作,但我看不出如何配置 dbcp2 来执行此操作。
除了临时表,这个问题还会影响:
【问题讨论】:
-
“返回池时始终关闭物理连接可以工作” ...这是一个矛盾,不是吗?如果连接关闭,它不会回到池中。您可以尝试通过发出查询
ROLLBACK RELEASE;来强制池释放数据库连接,这几乎肯定会做您想做的事情,但副作用会很有趣,并且池变得有点毫无意义.从根本上说,通过池化,您的代码必须确保它自己进行初始化,DROP TEMPORARY TABLE IF EXISTS...在创建表之前,等等。