2008-09-02 111 views
12

如何處理應用程序中的數據庫異常?
您是否在將數據傳遞給數據庫之前驗證數據,還是僅僅依靠數據庫模式驗證邏輯?
您是否嘗試從某種數據庫錯誤中恢復(例如超時)?數據庫異常處理最佳實踐

這裏有一些方法:

  1. 驗證傳遞到DB
  2. 左驗證,數據庫和處理DB異常正常
  3. 驗證兩側
  4. 驗證一些明顯的制約業務之前數據邏輯並將複雜驗證留給DB

您使用什麼方法?爲什麼?

更新:

我很高興看到越來越多的討論。
讓我們試着總結社區答案。

建議:

你還有什麼說?這被轉換爲驗證具體問題。我們錯過了核心,即「與數據庫相關的錯誤最佳實踐」,哪些需要處理哪些以及哪些需要泡泡?

回答

1

一般來說,我嘗試在輸入數據後儘快驗證數據。這樣,我可以在點擊「提交」或同等操作之後,提前給用戶提供有用的信息。
當談到進行數據庫調用時,我希望我傳遞的數據應該相當好。
我試圖在共享幫助程序方法的一個文件(或一組文件)中保持db調用,以使程序員(我或任何其他人添加調用)儘可能簡單地向日志寫入有關異常的詳細信息,並且什麼參數被傳入等

2

我試圖驗證雙方。我始終遵循的1規則永遠不會來自用戶的信任輸入。根據這個結論,我通常會在表單/網頁上進行一些前端驗證,甚至不允許提交不正確的數據。這是一個鈍器 - 這意味着您可以檢查/解析值以確保日期字段包含日期。從那裏,我通常會讓我的業務邏輯檢查數據條目是否在提交方式上有意義。例如,提交日期是否落入預期範圍?提交的貨幣價值是否落入預期範圍?最後,在服務器端,外鍵約束和索引可以捕獲任何通過的錯誤,這將導致DB異常作爲最後的手段,這可以由應用程序代碼處理。我使用這種方法是因爲它在調用數據庫調用之前儘可能多地過濾錯誤。

3

您想減少不必要的行程到數據庫,因此在應用程序內執行驗證是一種很好的做法。此外,它還允許您處理最容易從以下位置恢復的數據錯誤:靠近用戶界面(無論是在控制器中還是在用於簡單應用程序的UI層內)輸入數據的位置。

但是,有些數據錯誤無法以編程方式檢查。例如,你無法驗證相關數據存在的數據,而無需往返數據庫。像這些數據錯誤應該由數據庫通過使用關係,觸發器等來驗證。

如果處理數據庫調用返回的錯誤是一件有趣的事情。您可以在數據層,業務邏輯層或UI層處理它們。在這種情況下,最好的做法是讓這些錯誤在處理它們之前冒泡到最後一個負責任的時刻。例如,如果您有一個ASP.NET MVC Web應用程序,則您有三層(從下到上):數據庫,控制器和UI(模型,控制器和視圖)。應該允許數據層引發的任何錯誤冒泡到您的控制器中。在此級別,您的應用程序「知道」用戶正在嘗試執行的操作,並可以正確告知用戶有關錯誤的信息,並提出處理錯誤的方法。試圖從數據層內的這些錯誤中恢復,使得更難了解控制器內正在發生的事情。當然,在UI中放置業務邏輯並不被認爲是最佳實踐。

TL; DR:驗證無處不在,在最後一個負責任的時刻處理驗證錯誤。

0

我正在寫的應用程序(我自從搬遷了)是內部胖客戶端應用程序。
我會盡量保持客戶端的業務邏輯,並對db進行更多的機械驗證(即驗證只與程序的運行能力相關,而不是更高級的驗證)。
總之,驗證你可以在哪裏,並儘量保持相關類型的驗證。

+0

[@hamishmcn](http://stackoverflow.com/questions/39371/database-exception-handling-best-practices#39406)。好點,在業務邏輯層進行驗證的一個原因是創建用戶友好的用戶界面。但在多個地方進行這些驗證會打破DRY原則。你如何設法保持數據庫和客戶端驗證同步? – aku 2008-09-02 12:50:11

5

@aku:幹是很好,但它並不總是可能的。驗證就是其中一個地方,因爲您將有三個完全不同且無關的地方,其中驗證不僅可能,而且絕對需要:在UI內,在業務邏輯內以及在數據庫內。

想象一個Web應用程序。你想減少到服務器的旅程,所以你包括客戶端數據錄入的javascript驗證。但是您不能相信用戶輸入的內容,因此您必須在觸摸數據庫之前在您的業務邏輯中執行驗證。數據庫必須有自己的驗證,以防止數據損壞。

有沒有乾淨的方法來統一這三種不同類型的驗證在一個單一的組件。

有被做了一些嘗試,以統一像類似政策注射器內驗證交叉責任在P & P組的Policy Injection Application Block他們Validation Application Block結合,但這些仍然是基於代碼。如果您的驗證不在代碼中,您仍然必須單獨維護並行邏輯...

2

對象關係映射(ORM)工具,如NHibernate(或更好的,ActiveRecord)可幫助您避免大量通過允許將數據模型作爲適當的C#類構建到您的代碼中進行驗證。您也可以避免訪問數據庫,這要歸功於框架中內置的優秀緩存和驗證模型。

4

在客戶端和數據庫端都有一個殺手原因需要驗證,那就是安全。特別是當你開始使用AJAX的東西,可破解的URL和其他東西,使您的網站(在這種情況下)更容易對用戶黑客。

在客戶端進行驗證以提供流暢的體驗,以及早告訴用戶更正他們的輸入。也可以在數據庫中驗證(或在業務邏輯中,如果這被認爲是數據庫的完全安全網關)以確保您的數據庫安全。