這是我的場景,我有一個夜間批量作業,將記錄插入第三方系統/數據庫。所有這些導入調用都通過我創建的代理服務進行路由,主要是因爲我的夜間批量作業由於防火牆而沒有直接連接到第三方服務。通過代理Web服務重複Web服務調用 - 性能
因此,我爲每個作業運行導入10000條記錄。我建立了一個到我的代理服務的連接,在這裏代理服務建立到第三方Web服務的靜態引用/連接。現在(不要笑),我在我的代理服務中爲每條記錄建立連接。這意味着我的代理服務中有10000個「OpenConnection」和「CloseConnection」方法調用來完成這1個作業。我每天兩次運行這項工作。
我的問題是,如果我在第一個Web服務調用上建立連接,但在第一次調用時不關閉連接,後續Web服務調用將重新使用現有連接(因爲它是靜態的) ?或者它會重新創建與第三方服務的另一個會話?
如果這確實有效(將連接打開用於後續調用),那麼當我的工作完成時如何關閉連接,以便我可以釋放託管(或非託管)資源?我不想在我自己的Web服務中添加一個名爲「CloseConnection」的方法...
除此之外,如果當時連接仍處於打開狀態,我們的服務器每晚自動執行IIS RESETS ,它會正確處理我的連接嗎?
對不起,大量的問題在這裏,只是尋找一個「最佳實踐」的方法來完成我的任務,加快這一進程。
我會試着給這一個代碼示例,這裏的批作業代碼:
ws.EstablishConnection();
for (int counter = 0; counter < 10000; counter++)
{
ws.ImportRecord(myRecords[counter]);
}
ws.Dispose();
Web服務代碼:
[WebMethod]
public static void ImportRecord(MyRecord myRecord)
{
try
{
OpenConnection();
_3rdPartyWS.ImportRecord(myRecord);
}
catch (Exception)
{
throw;
}
finally
{
CloseConnection();
}
}
Thanks @Guish「你的連接對象是靜態的......你不能關閉連接而不顯式調用」closeConnection「,是否可以在這裏實現某種Dispose方法?」小心,因爲「open」連接可能會超時「。我遺漏了一些代碼,在MY web服務的OpenConnection()方法中,我檢查_3rdParyWS是否已經實例化並連接,如果不是,則重新建立連接。它會重新建立每一次 – ganders 2013-02-21 16:34:57
所以,如果我不在最後調用CloseConnection()方法,它會看到_3rdParyWS已經實例化並連接,然後跳過那一步呢?我想這樣做,但我得到每個單獨的導入調用的響應/錯誤代碼返回值與導入的狀態。我想我也可以走這條路線,只需將我的ImportDocumentResult對象更改爲一個數組而不是一個實例。我會看看我是否無法讓它工作。感謝您的幫助! – ganders 2013-02-21 16:36:51
如果您的連接對象被聲明爲「靜態」,那麼它將被共享給應用程序池中的所有對象。您的第三方合作伙伴可能會限制打開連接的最大數量。保持連接打開將「使用」最大連接數量的1。您應該始終關閉連接以保持乾淨,但連接會在某個超時後關閉。重用相同的「靜態」連接對象不應該使用新的連接。 – Guish 2013-02-21 17:08:17