2010-03-07 33 views
3

我正在製作一個Windows服務,它需要不斷檢查可隨時添加的數據庫條目,以告訴它執行某些代碼。它正在查看它的狀態是否設置爲未決,並且它的執行時間條目大於當前時間。是否只有這樣做才能反覆運行select語句?它可能需要每分鐘執行一次代碼,這意味着我需要每分鐘運行一次select語句查找數據庫中的條目。我試圖避免不必要的CPU時間,因爲我可能最終會支付主機供應商的CPU週期從Windows服務連續檢查數據庫

回答

1

注意,通知服務僅適用於SQL 2005,並從SQL 2008

而不是輪詢數據庫已被刪除更改,我想建議編寫一個從觸發器調用的CLR存儲過程,當發生適當的更改(例如插入或更新)時引發該過程。 CLR sproc會提醒您的服務,然後執行其工作。

通過TCP/IP或HTTP通道發送服務警報是一個不錯的選擇,因爲您可以在任何地方部署您的服務,只需修改由sproc讀取的一些配置參數即可。這也使得測試服務變得很容易。

我會在您的服務中使用事件驅動模型。該服務等待自動重置事件,在事件發生時啓動一個工作塊。 sproc通信通道在另一個線程上運行,並在每個傳入請求上設置事件。

假設服務正在完成一個工作塊,並且一組多個掛起的請求未完成,此設計可確保當前一個完成時,這些請求只會觸發另外一個工作塊。

如果需要重疊處理,您也可以讓多個工作人員在同一個事件上等待。

注:外部網絡訪問的CREATE ASSEMBLY聲明將要求PERMISSION_SET選項設置爲EXTERNAL_ACCESS

+0

我認爲這不會像只用Windows服務使用某些SELECT語句輪詢數據庫那樣強健。如果在Windows服務關閉時該觸發器觸發會發生什麼?通過輪詢,當Win服務恢復時,它會「趕上」並執行它在關閉期間錯過的所有交易。 Windows服務可能因爲許多原因而關閉,例如更新後重新啓動服務器。也許Windows Server是虛擬機羣集中的虛擬機,在從一臺主機遷移到另一臺主機時會錯過請求。我正在進行投票。 – tnktnk

+0

我設想觸發器的通知只是「發生了什麼事」,而不是「這裏是細節」。該服務在通知和啓動時仍然需要請求待處理的工作細節,但是我的模型避免了不必要的網絡流量,並將事件與數據請求之間的滯後降至最低。 – devstuff

1

鑑於您談論服務提供商,我懷疑其中一個主要替代方案不會公開你,這是通知服務。它允許你註冊數據改變的事件並被通知,而不需要輪詢數據庫。但是,它確實需要啓用服務代理才能正常工作,如果託管服務代理可能會成爲問題 - 有些公司會將其關閉。

這個問題沒有標記到特定的數據庫只是SQL,通知服務是一個SQL Server工具。

+0

找到一個允許通知服務器而不是提供者的地方可能比較容易,我需要一個可以託管Windows服務的虛擬機。我還沒有選擇提供商 – JonF