[英]Changes in database session context persists with pooled connection reuse
[英]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.