2013-02-21 206 views
0

這是我的場景,我有一個夜間批量作業,將記錄插入第三方系統/數據庫。所有這些導入調用都通過我創建的代理服務進行路由,主要是因爲我的夜間批量作業由於防火牆而沒有直接連接到第三方服務。通過代理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(); 
    } 
} 

回答

1

我的問題是,如果我建立連接第一個Web服務調用,但在第一次調用時不關閉連接,後續Web服務調用是否會重新使用現有連接(因爲它是靜態的)?

如果它是靜態的,將使用相同的對象。但是你不會獲得太多的速度。小心,因爲「打開」連接可能會超時。

或者它會重新創建與第三方服務的另一個會話?

Web服務是「無會話」的,每次調用都將在它自己的會話中進行。

如果這樣做的工作(離開連接打開後續調用), 我怎麼關閉連接時,我的任務完成了,所以我可以釋放我的 管理(或者是託管)的資源呢?我不想添加一個方法 名爲「CloseConnection」我自己的Web服務...

連接對象是靜態......你可以不調用來明確「closeConnection沒有密切的聯繫。

除此之外,我們的服務器自動做IIS將復位每晚 的基礎上,如果連接仍然是在那個時候開放,將它丟棄我的連接 正常嗎?

「池空閒」超時可能會在夜間基準IISReset之前傳遞。垃圾回收器會處理你身邊使用的每一個內存。第三方可能永遠不會收到close()請求,但它肯定會在一段時間後關閉連接。

你可以在你的情況下做的最好的事情是實現一個接收MyReccord數組的Web服務方法。你會在那裏節省很多時間。

[WebMethod] 
public static void ImportRecord(MyRecord[] myRecords) 
{ 
    try 
    { 
     OpenConnection(); 
     for (int counter = 0; counter < myRecords.Length; counter++) 
     { 
     3rdPartyWS.ImportRecord(myRecords[counter]); 
     } 
    } 
    finally 
    { 
     CloseConnection(); 
    } 
} 

更好的情況是,如果可能的話,要求你的第三方實現一個接收對象或文件數組的web方法。

Web服務循環非常慢,你不應該這樣做。

+0

Thanks @Guish「你的連接對象是靜態的......你不能關閉連接而不顯式調用」closeConnection「,是否可以在這裏實現某種Dispose方法?」小心,因爲「open」連接可能會超時「。我遺漏了一些代碼,在MY web服務的OpenConnection()方法中,我檢查_3rdParyWS是否已經實例化並連接,如果不是,則重新建立連接。它會重新建立每一次 – ganders 2013-02-21 16:34:57

+0

所以,如果我不在最後調用CloseConnection()方法,它會看到_3rdParyWS已經實例化並連接,然後跳過那一步呢?我想這樣做,但我得到每個單獨的導入調用的響應/錯誤代碼返回值與導入的狀態。我想我也可以走這條路線,只需將我的ImportDocumentResult對象更改爲一個數組而不是一個實例。我會看看我是否無法讓它工作。感謝您的幫助! – ganders 2013-02-21 16:36:51

+1

如果您的連接對象被聲明爲「靜態」,那麼它將被共享給應用程序池中的所有對象。您的第三方合作伙伴可能會限制打開連接的最大數量。保持連接打開將「使用」最大連接數量的1。您應該始終關閉連接以保持乾淨,但連接會在某個超時後關閉。重用相同的「靜態」連接對象不應該使用新的連接。 – Guish 2013-02-21 17:08:17