2010-07-13 41 views
0

我開發了一個.NET Winforms報表查看器(它只是運行查詢和顯示結果)。實時異常處理,SQL-Server驅動系統

這適用於報告數據庫。但是,以上是大型應用程序的一小部分,它從另一個數據庫獲取數據。它看起來像這樣:

受監視的系統狀態發生變化(例如延遲增加)=>事件作爲事務記錄到SQL Server數據庫(調用此數據庫A)=>這觸發了寫入相同事件的觸發器進入報告數據庫。

我不確定兩個數據庫之間的差異,他們可能會針對不同的目標進行調整,或者可能存在一些財務或甚至是兩個數據庫的政治原因。

無論如何,該術語提到報表數據庫在主數據庫上是「事務相關的」。這到底是什麼意思?報告數據庫完全依賴於數據庫A的事務?這讓我想到了一些問題:

1)我該如何處理報表數據庫沒有磁盤空間的情況,但數據庫A仍在觸發報表數據庫的觸發器?排隊 2)鏈接到上面,如果我排隊觸發器和他們的數據不能觸發報告數據庫(不知道如何,但概念上......),它會工作嗎?即使如此,這使得系統不是實時的。

像這樣的設置中的異常處理是否還有其他危險/問題?

謝謝

回答

1

這樣的依賴關係實際上在生產中非常糟糕。曾經,觸發器和更新(遠程)數據庫肯定會影響性能。但更重要的是可用性問題。依賴於數據庫A的應用程序現在與數據庫B的可用性綁定在一起,因爲如果數據庫B不可用,那麼觸發器將無法執行其工作,它將失敗並且應用程序將遇到錯誤。因此,現在數據庫B的amdinsitrator(s)掛鉤了應用程序使用數據庫A的操作。

此問題有很多方法,最簡單的方法是從數據庫A中的發佈部署事務複製在數據庫B中進行預訂。這樣就從事務處理的角度分離了兩個數據庫,從而允許依賴於數據庫A的應用程序在數據庫B不可用時不加限制地進行,或者只是緩慢地進行。

0

如果系統必須是實時的,那麼觸發器是唯一的方法。請注意,觸發器是完全同步的 - 報告數據庫上的操作必須成功完成,否則觸發器將失敗,並且很可能在事務數據庫上操作失敗,因爲它處於觸發器中,原始表上的語句將失敗,可能會或可能不會被捕獲,但無論如何,不​​會發生對事務數據庫中該表的更改。

此場景有合理的原因,但它確實在報告數據庫上創建了事務數據庫的依賴關係,因爲如果報告數據庫關閉,事務數據庫將變爲只讀或更糟。

這不是你想要的。

如果數據庫具有相同的結構,則可以查看複製。通常,當我想到一個報告數據庫時,我正在考慮一些針對報告進行了優化的不同結構,而不僅僅是出於性能原因而隔離的另一個數據副本(這很好,但這基本上只是將硬件拋向停止報告用戶傷害交易用戶的問題)。