Oracle上的數據庫連接可以保持連接生存期的會話狀態,即以包變量的形式存在。清除Oracle會話狀態
有沒有一種方法可以在連接期間刷新/清除所有狀態,而不會中斷連接並重新建立新的連接。
I.e.考慮首先在程序包init中設置的程序包變量,然後在該程序包中的某些過程中對其進行修改:如何「重置」程序包,以便從1個連接對程序進行多次調用總是會導致程序包重新啓動?
一般情況下:如何在執行來自該連接上的客戶端的語句之間「重置」任何會話狀態?
Oracle上的數據庫連接可以保持連接生存期的會話狀態,即以包變量的形式存在。清除Oracle會話狀態
有沒有一種方法可以在連接期間刷新/清除所有狀態,而不會中斷連接並重新建立新的連接。
I.e.考慮首先在程序包init中設置的程序包變量,然後在該程序包中的某些過程中對其進行修改:如何「重置」程序包,以便從1個連接對程序進行多次調用總是會導致程序包重新啓動?
一般情況下:如何在執行來自該連接上的客戶端的語句之間「重置」任何會話狀態?
dbms_session.reset_package
是我能想到的最接近的。看到這個tahiti link。
除了dbms_session.reset_package
(在RenéNyffenegger的回答中提出),它會重置所有包,您必須編寫自己的包過程來重置單個包的狀態。該過程只會將所有包變量設置爲NULL(或任何適當的)。
喲,可行,但容易出錯,並依賴於開發人員/更改軟件包。我的用例涉及通過數據庫連接池從持久(長期)前端Websocket連接調用SP。因此,Websocket前端和數據庫後端連接之間不存在1:1關係。我想確保沒有信息通過數據庫池連接上的全局狀態通過不同的WebSocket連接泄漏。 – oberstet
Thx!這應該爲包狀態做(儘管不幸的是,這也會清除任何緩存的遊標)。除了包變量之外,還有其他全局會話狀態(因此不能通過上面的reset_package清除)? – oberstet
啊,'DBMS_SESSION.RESET_PACKAGE()'與'DBMS_SESSION.MODIFY_PACKAGE_STATE(DBMS_SESSION.FREE_ALL_RESOURCES)'是一樣的,但也有'DBMS_SESSION.MODIFY_PACKAGE_STATE(DBMS_SESSION.REINITIALIZE)',它不釋放資源(以性能命中),但重新獲得數據。大。 – oberstet
@oberstet感謝您的澄清 –