我正在製作一個Windows服務,它需要不斷檢查可隨時添加的數據庫條目,以告訴它執行某些代碼。它正在查看它的狀態是否設置爲未決,並且它的執行時間條目大於當前時間。是否只有這樣做才能反覆運行select語句?它可能需要每分鐘執行一次代碼,這意味着我需要每分鐘運行一次select語句查找數據庫中的條目。我試圖避免不必要的CPU時間,因爲我可能最終會支付主機供應商的CPU週期從Windows服務連續檢查數據庫
回答
注意,通知服務僅適用於SQL 2005,並從SQL 2008
而不是輪詢數據庫已被刪除更改,我想建議編寫一個從觸發器調用的CLR存儲過程,當發生適當的更改(例如插入或更新)時引發該過程。 CLR sproc會提醒您的服務,然後執行其工作。
通過TCP/IP或HTTP通道發送服務警報是一個不錯的選擇,因爲您可以在任何地方部署您的服務,只需修改由sproc讀取的一些配置參數即可。這也使得測試服務變得很容易。
我會在您的服務中使用事件驅動模型。該服務等待自動重置事件,在事件發生時啓動一個工作塊。 sproc通信通道在另一個線程上運行,並在每個傳入請求上設置事件。
假設服務正在完成一個工作塊,並且一組多個掛起的請求未完成,此設計可確保當前一個完成時,這些請求只會觸發另外一個工作塊。
如果需要重疊處理,您也可以讓多個工作人員在同一個事件上等待。
注:外部網絡訪問的CREATE ASSEMBLY
聲明將要求PERMISSION_SET
選項設置爲EXTERNAL_ACCESS
。
鑑於您談論服務提供商,我懷疑其中一個主要替代方案不會公開你,這是通知服務。它允許你註冊數據改變的事件並被通知,而不需要輪詢數據庫。但是,它確實需要啓用服務代理才能正常工作,如果託管服務代理可能會成爲問題 - 有些公司會將其關閉。
這個問題沒有標記到特定的數據庫只是SQL,通知服務是一個SQL Server工具。
找到一個允許通知服務器而不是提供者的地方可能比較容易,我需要一個可以託管Windows服務的虛擬機。我還沒有選擇提供商 – JonF
如果您使用SQL Server並打開其他方法,請查看SQL Server Notification Services。
Oracle還提供通知,調用它Database Change Notification
- 1. Windows服務和數據庫連接
- 2. Windows服務未連接到數據庫
- 3. 連續檢查服務器的狀態
- 4. 連續可觀察Web服務和數據庫查詢調用
- 5. Windows服務+從數據庫中讀取
- 6. 從Windows服務訪問數據庫
- 7. 檢查SSIS連接管理器對服務器和數據庫
- 8. 通過使用Team Foundation服務將SQL數據庫連續傳遞到Windows Azure
- 9. 檢查數據是否連續發送
- 10. 如何連續檢查數據?
- 11. JavaScript從數據庫連續計數
- 12. 連續查詢數據庫PHP
- 13. parse.com連續的數據庫查詢
- 14. Android - 從服務中查詢數據庫
- 15. 從遠程服務查詢數據庫
- 16. 檢查是否有從Windows服務
- 17. 檢查數組4連續
- 18. 連續應用從數據庫
- 19. Ajax從數據庫中連續提取
- 20. 從Windows服務連接到WCF服務
- 21. windows服務上的ODBC數據連接
- 22. Wso2數據服務服務器超時數據庫連接
- 23. 如何從asp.net服務器連續接收數據到flash?
- 24. 從4G模塊發送連續數據到服務器
- 25. 從數據庫服務JSF
- 26. 檢查,並從數據庫
- 27. Windows Azure Web服務,無法連接到SQL數據庫
- 28. 在windows服務器連接mysql數據庫與c#程序
- 29. Windows Azure雲服務與sql數據庫的連接
- 30. SQL數據庫和Windows服務之間的連接
我認爲這不會像只用Windows服務使用某些SELECT語句輪詢數據庫那樣強健。如果在Windows服務關閉時該觸發器觸發會發生什麼?通過輪詢,當Win服務恢復時,它會「趕上」並執行它在關閉期間錯過的所有交易。 Windows服務可能因爲許多原因而關閉,例如更新後重新啓動服務器。也許Windows Server是虛擬機羣集中的虛擬機,在從一臺主機遷移到另一臺主機時會錯過請求。我正在進行投票。 – tnktnk
我設想觸發器的通知只是「發生了什麼事」,而不是「這裏是細節」。該服務在通知和啓動時仍然需要請求待處理的工作細節,但是我的模型避免了不必要的網絡流量,並將事件與數據請求之間的滯後降至最低。 – devstuff