2016-01-22 107 views
3

我有一個網頁,並使用CRUD操作在MySQL表中進行一些數據操作。有很多桌面客戶端應用程序的運行實例與同一個數據庫進行通信,每當我通過網頁對此數據庫進行更改時,都需要將這些客戶端通知有關更改。我不知道如何處理這個問題的最佳方式。桌面客戶端應用程序是用C#編寫的。另外,我知道,至少在使用ADO.NET提供程序的MySQL中,無法異步通知桌面客戶端數據庫中發生的更改。收聽MySQL中的數據庫更改

當客戶端應用程序定期創建數據庫連接並檢查更改MySQL表時,有一個選項。但是如果我們有1000個正在運行的實例並且每個創建連接並每隔2秒讀取一張表呢?數據庫服務器資源消耗是不是很重要?

此外,我們可以寫上插入/更新觸發器/刪除其填充約所做的更改另一個表,之後我們將要查詢該新的「CHANGES_MADE」表。

也有是創建套接字服務器,輪詢「CHANGES_MADE」表中的一個選項,如果更改時則變化的數據發送給所有桌面客戶端這是在這種情況下套接字監聽。因此,我們將擺脫客戶端進行的輪詢,並顯着減少數據庫連接和數據庫負載的總量。

在這裏,我想知道什麼是解決這些任務的最正確和可擴展的方法。

+0

這個問題非常廣泛,很容易變成資源請求。保持它不是一個資源請求,我最近回答[這裏](http://stackoverflow.com/a/35381581)與本機非第三方鏈接。 – Drew

回答

4

嗯,這也不是完全不可能的通知做數據庫的修改的客戶,雖然對此沒有內置的解決方案。

在MySQL可以創建編譯的用戶定義函數(UDF)中C/C++。這些可以以任何您想要的方式擴展mysql的功能 - 例如通過網絡發送消息。您可以創建自己的UDF或使用mysqludf.org上的庫通過網絡發送消息。您可以先使用mysqludf.org上的STOMP庫發送STOMP消息。由於STOMP與語言無關,因此您可以在.NET環境中使用它,請參閱this SO topic(如果在Internet上搜索.net STOMP服務器,則可以找到更多示例)。

客戶端應用程序必須實現STOMP服務器能夠從服務器接收的STOMP消息。

在你需要創建一個保存其客戶認購連接到它給你的通知,以及如何(IP地址/主機名和端口號作爲最低)的信息的預訂表的數據庫。

您還需要在所有要發送通知的表和事件上創建觸發器。

我還會創建一個存儲過程或函數,它接收修改後的數據或某些表已從觸發器中更改的事實,檢查訂閱表,創建STOMP消息,然後調用發送STOMP的已編譯的UDF消息給所有訂閱的客戶端。觸發器會調用這個存儲過程或函數,而不是在每個觸發器中實現所有這些功能。

需要修改客戶端以處理通知並採取進一步操作或提示用戶。

聲明:我不認爲這是針對您的特定情況的最充分和可擴展的解決方案。但是,通過這種方式,您可以自行實施通知系統,從而避免輪詢您的數據庫。