簡體   English   中英

在C#中強制關閉oracle連接

[英]Force closing an oracle connection in C#

我有一個報告窗口,其中顯示了從可能長時間運行的oracle存儲過程返回的結果。 我的問題是,當用戶關閉窗口時,與oracle的連接保持打開狀態,並且可能長時間運行的報告不會被取消。

關閉打開的連接的唯一方法是讓DBA手動殺死它們或讓用戶退出整個應用程序。

我嘗試從另一個線程在連接上調用Close ,但這似乎一直處於阻塞狀態。 我還嘗試回滾事務,但這也存在相同的問題。

我擔心唯一的解決方案是在不同的過程(或應用程序域?)中運行查詢。

我很可能缺少明顯的東西,任何幫助將不勝感激。

請閱讀

這個問題不是關於將我的連接包裝在using語句中。 關於如何強制執行查詢的oracle連接關閉

例:

  • 啟動運行查詢的線程
  • 將連接對象藏在某處
  • 在連接對象上調用關閉

     public void Go() { OracleConnection connection; var queryThread = new Thread( () => { using (connection = OpenOracleConnection()) { // execute stored proc that takes 45 mins // raise an event with the data set we load } }); Thread.Sleep(3000); // give it time to be useless var closeThread = new Thread( () => { connection.Close(); }); closeThread.Start(); } 

問題在於這不會關閉連接,而是對connection.Close()的調用會阻止等待過程執行。

嗯,我看不到API中的任何內容來終止/取消正在進行的查詢。 從技術上講,應該可以使用第二個具有完全特權的會話來標識要中止的會話,並在該會話上發出kill session命令。 我希望您的原始會話可以通過某種方式紓困,但我從未嘗試過。

這里說明了如何終止會話。

在這里回答如何獲取會話ID。 您可以在開始長時間運行的查詢之前找到一個會話,然后從第二個連接中確切終止該會話應該很容易。

讓我們知道它是否有效;)

要查看什么/誰阻止了誰:

select s1.username || '@' || s1.machine
   || ' ( SID=' || s1.sid || ' )  is blocking '
   || s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS status
   from v$lock l1, v$session s1, v$lock l2, v$session s2
   where s1.sid=l1.sid and s2.sid=l2.sid
   and l1.BLOCK=1 and l2.request > 0
   and l1.id1 = l2.id1
   and l2.id2 = l2.id2;

與.NET中的任何提供程序一樣,您可以調用Dispose

using(var conn = /* your connection */) {
    // do your stuff

    conn.Close();
} // this will automatically call .Dispose()

這就是您需要做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM