2013-01-24 73 views
0

我需要在應用程序中的特定事件上調用外部Web服務。我不想修改我的應用程序並使該外部Web服務的任何依賴關係。所以,我需要想辦法用某種外部組件來做到這一點。從SQL CLR調用Web服務時可能出現的性能問題

一種可能的方法是,當我的應用程序發生某些事件時,我將製作數據庫視圖。然後我將在該視圖上設置觸發器,它將調用CLR函數。在那個CLR函數中,我將調用外部Web服務。通過這樣做,我將得到「實時」的整合,這很好。但是,這種方法有缺點。主要的一點是,從CLR調用Web服務似乎不是一個好主意,因爲它會阻塞主SQL線程(?!),直到CLR收到一些答案。

到現在爲止,我只發現設置該屬性會遇到性能問題的幫助:

System.Net.ServicePointManager.DefaultConnectionLimit = 9999 

更多關於它,你可以找到here

現在,既然您知道我的需求(即實時或至少接近實時的集成,而不需要從我的應用程序調用到外部Web服務),那麼有沒有更好的方法來實現它?

我能想到的另一種方法是有一些服務,它會定期檢查我的數據庫中需要觸發外部Web服務調用的更改。一旦該服務檢測到這種變化,它將調用Web服務並傳輸數據。這當然不是真正的實時融合。我必須承認,除了性能問題之外,我更喜歡觸發器和CLR,因爲它保證了實時集成並且對我的應用程序無任何影響。

回答

1

我不確定我是否同意將Web服務調用移動到數據庫的設計。不過,我確信有理由爲什麼你不想改變應用程序。

這裏有一對夫婦,你可以嘗試選擇 -

1)除了數據庫,並CLR使得Web服務調用,使用消息隊列。 NServiceBus是通過事件發生的消息,一個不錯的選擇,如果你堅持使用SQL服務器存儲事件可以觸發這個調用

2),看SQL server Service broker

+0

感謝的建議,我會考慮他們。更改應用程序不是一種選擇,因爲它更像是一種產品。因此,與特定部署相關的任何細節都是作爲一些外部組件,服務或類似的。 – buhtla

+0

不幸的是,Service Broker因爲我只使用SQL Express版本而不在使用。 – buhtla

+0

在這種情況下,嘗試查看總線選項,如果總線太重,異步隊列應該有所幫助。 –

相關問題