2012-09-30 47 views
0

似乎SqlConnections在一段時間不活動之後關閉。我需要能夠控制連接保持打開狀態的時間。有一個「連接超時」和「連接生命週期」屬性可以配置爲連接,但他們不會做我需要的。強制SqlConnection在指定的持續時間內打開

問題是,我們的應用程序是巨大的,並且在很多地方,一些屏幕打開時,連接不會關閉。用戶可以打開一個屏幕,然後去吃午餐,然後回來,然後嘗試做一些事情,並得到「連接已經丟失」的例外。我知道這是一個反模式,但現在在一個地方延長連接生命週期,然後在數千個地方打開/關閉和連接連接會更容易。

+2

答案是修復您的應用程序,以便在使用它們後關閉連接。你正在尋找的東西不存在 - 連接超時是唯一的選擇。 – Oded

回答

0

你正在設計你的應用程序非常錯誤。連接不應該保持打開狀態的時間超過一組查詢(即單個操作所需的查詢)。不用擔心,因爲SqlConnection會根據連接字符串內部池連接,所以不存在性能問題。因此,即使您打開和關閉連接,REAL連接也會保持打開一段時間。

更重要的是,在內部,如果連接已關閉,那麼在需要時池會重新打開它,因此您不必擔心。

嚴重的是,只需在您使用它們時打開和關閉連接即可。這就是它應該如何工作。

僅供參考,連接關閉的原因是內部連接池會「回收」已經打開很長時間的連接。因此,通過保持連接開放,你正在與連接池打架。

+0

@usr - 良好的捕獲,我的意思是一個單一的邏輯操作,其中可能包括多個查詢。 –

0

連接不會自動關閉。有些東西失敗了,像網絡。

雖然這是預期的。不要讓連接打開!你正在努力反對系統是如何使用的,你會爲此付出代價。

更改應用程序,使其每個工作單元使用一個連接,然後關閉它。作爲創可貼修復程序,請確保在執行查詢之前SqlConnection.StateOpen

+0

實際上,連接池將在一段時間後回收打開的連接。僅當您通過關閉它們將它們返回到池中時,請參閱http://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.80).aspx –

+0

@MystereMan。只要您保持SqlConnection對象處於打開狀態,沒有人會在您之下關閉它。那太可怕了!這將不可預測地放棄交易。它可能會將故障注入任何查詢並導致可用性問題。 – usr

+0

它可能是可怕的和不可預知的,但它會發生什麼。閱讀我發給你的鏈接。 「連接池會定期掃描連接池,查找未關閉或處置未關閉的未使用連接,並收回找到的連接池。」和「連接池會在連接池閒置一段時間後刪除連接,或者如果池中檢測到與服務器的連接已被切斷。」 –

-1

它不好編程打開連接這麼久。數據庫任務完成後,隨時需要打開連接並關閉。如果您覺得它會影響您的應用程序性能,請使用連接池

+0

謝謝,帽。我在我的問題中說過同樣的話。 –