2008-09-08 70 views
6

將一個.Net Winforms應用程序..混合在一個flakey無線網絡連接中,與一些喜歡簡單地拔出藍色插頭並偶爾使用的用戶一起攪拌,並添加一個系統管理員來決定重啓SQL服務器盒沒有警告一次又一次,只是爲了讓每個人都在腳趾上。當數據庫脫機時,您如何管理您的應用程序?

哪些關於處理這種情況的到建議和對策:

  • 錯誤處理 - 比如,你包的每 調用服務器與一個try/catch 或做你依靠某種形式的 通用錯誤處理來管理 這個?如果是這樣的話是什麼樣的?

  • 應用管理 - 例如,你 禁用應用程序,而不是讓用戶 與它進行交互,直到再次檢測到 連接?你會怎麼做?

+0

爲了最終確定 - 我們對離線工作的用戶使用MS同步服務。但是我們發現,在一個大型系統上同時運行Sync Services中的50多個用戶會導致SQL Server死機,因爲我們試圖管理服務器上的衝突和負載。 – gleng 2008-10-30 10:36:35

回答

3

答案取決於類型應用程序的。有些應用程序可以脫機工作 - 例如Microsoft Outlook。此類應用程序不會將連接性異常視爲關鍵,它們可以在本地保存您的工作並稍後進行同步。網絡遊戲等其他應用程序會將通信問題視爲關鍵異常,並在連接丟失時退出。

由於錯誤處理,我認爲你應該控制在所有圖層上的異常,而不是依靠一些常規的異常處理的代碼。您的業​​務層應該瞭解底層(我們的數據訪問層)發生了什麼,並相應地做出響應。在我看來,丟失的連接不應該被視爲意外的異常。對於例外管理的良好做法,我建議看看Exception Handling Application Block

關於應用程序的行爲,你應該回答自己屬於以下問題:「我的應用程序具有商業價值的客戶處於斷開狀態?」在許多情況下,最終用戶能夠在斷開狀態下繼續工作將是有益的。然而,這種行爲極難實施。

特別是爲您的方案Microsoft開發Disconnected Service Agent Application Block

0

在我們的應用中,我們使用戶能夠連接到另一臺服務器,例如,如果數據庫連接失敗,顯示一個對話框,稱該服務器不可用的選項,他們可以輸入另一個IP地址嘗試。

1

我們有這個在我們Main()方法,它捕獲所有未處理的異常......

Application.ThreadException += new 
System.Threading.ThreadExceptionEventHandler(UnhandledExceptionCatcher); 

Thread.GetDomain().UnhandledException += new 
UnhandledExceptionEventHandler(Application_UnhandledException); 

然後Application_UnhandledExceptionUnhandledExceptionCatcher顯示用戶友好的消息。

另外的應用程序然後電子郵件的數據,如堆棧跟蹤其可以是非常有用的開發者。

這取決於課程的應用程序,但對於那種你描述我會關閉應用程序下來失敗。

2

我還沒有觸及多年WinForms和.NET現在,所以我不能給你任何技術細節,但該啤酒圖片答案:

首先 - 不要你的表單數據直接綁定到數據庫。

創建綁定表單控件到一個單獨的數據/模型層。

從那裏,你有你可根據穩定性和需要提供的可用性水平,幾個選項。

也許最簡單的解決方案之一,這裏是只啓用/禁用應用程序的需要與基於連接狀態的數據庫交互的部分。

下一步的保護級別將包括本地緩存中的數據模型的一部分,而數據庫連接斷開時,使用本地緩存用於查看和禁用需要明確的數據庫連接的任何功能。

也許最棘手的事情(也可能爲最終用戶提供最穩定的體驗)是在本地複製數據庫並使用某種同步模式來保持數據庫副本與遠程數據庫同步。

1

這可能有點對離線場景的支持很多,但你有沒有考慮過「Microsoft Sync Framework」?框架中包含「Sync Services for ADO.NET 2.0」,它允許您的應用程序訪問本地SQL Server CE實例。這可以通過各種方法輕鬆地與中央SQL Server同步。

此框架處理永久離線的情況下,正如我所說,這可能不適合您的具體要求,但是它會給你的應用固體離線支持。

0

使用類似SQLite存儲數據下線,直到連接可用。

更新:我相信SQLite是Google Gears的後端,從我的理解中可以知道您在web應用程序中尋找什麼......儘管我不知道它是否可以在非web上下文中使用。

相關問題