2009-08-11 45 views
1

我有一個asp.net網站和一個數據庫。適用於SOAP Web服務(.net)中的db連接的地方

該網站有一個用於存儲我的軟件反饋的Web服務。

據我所知,IIS將重複使用創建的對象進行順序請求。 這給出了連接到Web服務的構造函數中的數據庫的原因,正確實施Dispose()方法,並使用連接服務每個[WebMethod] Request()。當前版本遵循這個模式。

另一方面,恐怕Web服務的連續請求之間的時間間隔將大於數據庫連接超時。因此,我需要捕捉一些異常並重新創建連接(對吧?)

另一種方法是連接並關閉每個[WebMethod] Foo()。但恐怕這可能會傷害到演出。

總結, 我應該在構造函數中連接到數據庫並關閉連接Dispose()或連接並關閉每個請求的數據庫?

+0

不,網絡服務對象不會被重用。將爲每個請求創建一個新實例。 – 2009-08-11 14:25:13

回答

5

您應該爲每個請求連接。

頁面實例僅用於單個請求,因此您不能在其中存儲連接以重用它。你將不得不把它存儲在其他地方,這是非常複雜的(線程安全等),它絕對不值得。

當您關閉連接時,實際的數據庫連接將返回到連接池。當連接池被重用於您創建的下一個連接對象時,連接池會正確地重置連接,以便您獲得一個活動且未被以前使用過的連接。

連接池工作正常,您應該使用它而不是嘗試自己創建一個連接池。

您不需要做任何特殊的事情來使用連接池,它是內置到數據庫驅動程序中的。像往常一樣打開和關閉連接對象。

+0

對於我們Java的人來說,你是說在asp.net中,你自動獲得連接池,還是需要做一些特定的配置或編碼?線程池事務是否知道?如果你在答案中拼寫出來,可以幫助未來的讀者。 – djna 2009-08-11 14:38:58

+0

好點。我會做一些編輯... :) – Guffa 2009-08-11 14:42:46

+0

感謝您解釋:-) – djna 2009-08-12 07:33:13

0

你有任何連接池設施供您使用嗎?您的WS對象將從池中獲取連接,並在完成時返回它們。游泳池處理超時和真正的開放和關閉。

我的接近順序是:

1)。如果你有連接池使用它。 2)。否則保持簡單,打開並關閉每個請求。編寫一個線程安全的連接池不是微不足道的。 3)。如果性能證明是一個問題,那麼調查每次連接開銷是否是原因。如果是這樣,找一個池implmentaiotn或(最後的手段)代碼池你的自我。

1

從ADO.NET 2.0開始,數據庫連接被集中,所以連接的實際開啓和關閉由DB連接池管理,您可以在各個方法中自由地打開和關閉它們,因爲池會一直保持打開狀態,直到超時。您也可以配置池設置。