首页 > 解决方案 > 对数据库会话上下文的更改通过池连接重用持续存在

问题描述

在我的应用程序中,我有一个连接池,用于获取到 Oracle 数据库的连接。

我需要执行调用可能影响数据库会话上下文/变量的存储过程的语句,以便这些更改仅影响连接的当前使用。

当我关闭连接并从池中获取另一个连接时,我希望它像一个不存在过程效果的新连接/会话。不幸的是,这不会发生。

所以我获得了一个连接,调用了以下过程:

PROCEDURE set_empno (empno NUMBER) IS
  BEGIN
    DBMS_SESSION.SET_CONTEXT('app1_ctx', 'empno', empno);
  END;

像这样:

CALL APP1_CTX_PACKAGE.SET_EMPNO(11)

然后我执行这个查询,它按预期工作(返回值11):

SELECT "PRICE", "EMPNO" FROM "ORDERS" WHERE empno = SYS_CONTEXT('app1_ctx', 'empno')

直到现在一切看起来都很好,我关闭了连接(所以它返回到池中)并调用pool.getConnection从池中获取连接(我希望它像新的一样没有任何影响)。问题是如果我刚刚获得连接后调用:

SYS_CONTEXT('app1_ctx', 'empno')

在关闭连接之前,我得到了来自调用的值11 。由于我没有使用此连接设置值,因此我期望得到错误或 null。

有什么方法可以重置会话或连接以充当新会话或连接,而无需对上下文或安全上下文或类似的任何内容进行任何更改

请注意,我不想只重置app1_ctx,我想消除对会话的任何更改(我不知道用户在他的呼叫中究竟会改变什么)

另请注意,我使用此应用程序访问不同的数据库:Oracle、MySQL、SQLServer ..etc

标签: javasqldatabaseoraclejdbc

解决方案


对于 Oracle,您需要调用DBMS_SESSION.RESET_PACKAGE. 调用该过程会重置所有包的会话状态,因此会话看起来像一个新会话。


推荐阅读