java - 对数据库会话上下文的更改通过池连接重用持续存在
问题描述
在我的应用程序中,我有一个连接池,用于获取到 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
解决方案
对于 Oracle,您需要调用DBMS_SESSION.RESET_PACKAGE
. 调用该过程会重置所有包的会话状态,因此会话看起来像一个新会话。
推荐阅读
- reactjs - 如何使用react router dom将目录组件替换为详细的项目组件?
- git - 特定提交的 Git-merge 和 Git-cherry-pick 有什么区别?
- reactjs - 如何识别在 react-router 中加载了哪个开关组件
- php - 用户个人资料未更新用户信息
- python - 解析具有多个对象的动态Json文件并在python中插入字典
- python - 将嵌套列表合并到列表元组列表中的组中
- swift - 无法在表格视图中选择单元格 - swift
- unit-testing - 是否可以使用类型类将 `ReaderT (IO a) IO a` 更改为 `ReaderT (ia) IO a`?
- vega-lite - 是否可以创建与 Altair/Vega-Lite 中的选择过滤器一起使用的自定义聚合?
- php - 更改复选框选择的 div 颜色