【问题标题】:Clear Oracle session state清除 Oracle 会话状态
【发布时间】:2012-09-23 04:33:45
【问题描述】:

Oracle 上的数据库连接可以具有在连接的生命周期内持续存在的会话状态,即以包变量的形式。

有没有办法在连接期间刷新/清除调用之间的所有状态,而不会终止连接并重新建立新连接。

即考虑首先在包 init 中设置的包变量,然后在该包中的某个过程中进行修改:如何“重置”包,以便从 1 个连接对过程的多次调用总是导致重新初始化包?

一般来说:如何在该连接上从客户端执行语句之间“重置”任何会话状态?

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    dbms_session.reset_package 是我能想到的最接近的。看到这个tahiti link

    【讨论】:

    • 谢谢!对于包状态应该这样做(尽管不幸的是这也会清除任何缓存的光标)。除了 package vars,还有其他的全局会话状态(因此没有被上面的 reset_package 清除)?
    • 啊,DBMS_SESSION.RESET_PACKAGE()DBMS_SESSION.MODIFY_PACKAGE_STATE(DBMS_SESSION.FREE_ALL_RESOURCES) 一样,但也有DBMS_SESSION.MODIFY_PACKAGE_STATE(DBMS_SESSION.REINITIALIZE) 不释放资源(性能受到影响),而是重新初始化数据。太好了。
    • @oberstet 感谢您的澄清
    • @RenéNyffenegger 我已经从 java JDBC 尝试了所有三个,即: [callStmt = con.prepareCall("begin DBMS_SESSION.RESET_PACKAGE; end;"); callStmt.execute();] 但它们没有效果。有什么我可以添加的以确保它立即生效
    【解决方案2】:

    除了重置所有包的dbms_session.reset_package(在 René Nyffenegger 的回答中提出)之外,您必须编写自己的包过程来仅重置单个包的状态。该过程只会将所有包变量设置为 NULL(或任何适当的值)。

    【讨论】:

    • 是的,可行,但容易出错并且依赖于开发人员/更改包。我的用例涉及通过数据库连接池从持久(长期)前端 Websocket 连接调用 SP。因此,Websocket 前端和数据库后端连接之间没有 1:1 的关系。我想通过数据库池连接上的全局状态确保不同 Websocket 连接之间没有信息泄漏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2023-03-14
    • 1970-01-01
    • 2014-06-25
    • 2010-12-05
    • 2015-04-16
    相关资源
    最近更新 更多