2011-11-14 30 views
2

我們開發了一個運行在MS SQL Server上的C#WinForms應用程序。直到今天,我們正在使用一個非常簡單的自制OR-Mapper(使用Reflection),並使用一個單獨模式實現的廉價緩存機制。有一個用戶觸發了「重置」功能。該架構是一個簡單的兩層(客戶端,服務器)三層(客戶端的表示和邏輯,MS SQL作爲服務器上的數據層)。全網數據同步

通常我們會加載大約300行,大約30列,這些列經常發生變化(以及一些其他表格很少發生變化)。此應用程序的不同實例在不同的客戶端計算機上運行,​​加載了相同的300行並正在隨機行上更改數據。應用程序立即在數據庫上更新數據。在他們這樣做之前,檢查完整性以便用戶在出現問題時得到反饋。但是對於某些行,用戶會在屏幕上看到舊值,因此當他想確保獲得最新數據時,他必須手動重置緩存。

如果應用程序考慮更改的行本身,那將會很不錯。每隔幾秒都會有更新。但是,只有部分更新相關的其他應用程序(取決於有源濾波器...)

解決方案,我心裏有:

  1. 使用OR映射器具有一個共同的高速緩存(例如, NHibernate與集羣緩存)
    • 打開問題:這些L2緩存爲客戶端應用程序?緩存更改發生時可以觸發UI更新嗎?其他基於OR-Mapper的解決方案?
  2. 使用應用程序服務器實現另一個層,將邏輯移動到此應用程序服務器。只運行一個實例,它緩存數據並在邏輯對象上發送事件,通知其他客戶端更新的數據。不要在客戶端緩存任何數據。
  3. 添加一些類型的數據變化的邏輯電平通知(基於廣播noticiation ...)
    • 開放式問題:現有的庫?在SQL Server上加載?
  4. 完全的其他解決方案?

我知道我沒有得到的解決方案在這裏。只需要關於這些解決方案(或新的解決方案)的一些想法...感謝您的任何投入!

回答

0

老實說,聽起來像是你正在從一座痣山上爬出一座山。如果您只是加載300條記錄,則只需每隔一段時間從數據庫重新加載數據,並且不要打擾緩存。數據集非常小,無論如何都會非常快,而且您不會有使用分佈式緩存的額外複雜性和失敗點以及所有這些。

如果您需要確保只有一個人寫入數據庫,並且該人員寫入最近的數據。你可以實現某種數據庫鎖表,並在你這樣做之前檢查是否有其他人在寫。

+0

好吧,我在這裏忘了一些東西:在用戶的網格上顯示了300行,但這些是實際數據集的分組視圖。實際的數據集可以是幾百到幾千個記錄......另外,當我更新整個數據集時,讓我們說每隔5秒鐘客戶端本身就非常忙於重畫網格等等。我想在行級別上進行更改... – falstaff

1

我自己沒有使用過這個,但是我相信SQL Server在對先前查詢的數據進行更改時有dependency functionality that can notify your application

但我不知道如何與訂閱這些通知的應用程序數量成比例。我在該頁面上有一個說明,表示這種方法不適用於大量客戶。

+0

我會看看那個,謝謝! – falstaff

+0

嗯,我剛剛看到SELECT語句只能在使用這個功能時使用SQL語法的一個子集...儘管如此,我仍然可以爲我工作:-) http://msdn.microsoft.com/en- us/library/ms181122.aspx – falstaff

3

我想在這裏分享我的經驗。類似的情況下,所有的客戶都在一個公司局域網。我在客戶端應用程序中實現了一個UDP客戶端(發送者/接收者),當客戶端更新數據時,廣播「網絡廣播地址」中的「DataRefreshMessage」。所有其他客戶端在接收到「DataRefreshMessage」時更新其視圖。

我知道UDP是不可靠的,但對我的要求足夠可靠,我的解決方案工作得很好。

+0

我們在同一個場景中使用了Tibco Rendezvous,它性能良好,可以消除對特定網絡協議的依賴,並且即使使用UDP也能提供可靠的傳輸。 – mikalai