繁体   English   中英

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

[英]Changes to database session context persists with pooled connection reuse

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

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

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

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

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,因为我没有使用此连接设置值。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM