2013-02-13 88 views
2

在我的應用程序中觸發了許多不同類型的事件 - 我想隨着時間對它們進行計數以跟蹤。將時間間隔抽樣統計到數據庫中

我想弄清楚這樣做的最佳方法。我將有多個服務器和線程保存事件,因此它必須在併發期間工作。

每個事件我不能有一行,因爲事件的數量非常大,所以必須以某種方式進行彙總。

所以,我試圖讓每個事件類型的錶行和「時間間隔」像

COLUMN 
------ 
ID   
EVENTTYPE 
COUNT 
FIRSTTIMESTAMP 
LASTTIMESTAMP 

我第一次嘗試,使其中一個新行是由記錄器創建了一個解決方案:

UDPATE EVENTCOUNTER SET COUNT = COUNT + 1 WHERE LASTTIMESTAMP > CURRENT TIMESTAMP and EVENTTYPE = ?; 

如果num rows updated = 0,則插入帶有新時間戳的新行。

但是,爲了使這項工作,我將不得不鎖定整個表,以便不會有競爭條件從多個線程創建新的行。

LOCK TABLE EVENTCOUNTER .. 
UPDATE .. 
if numRows = 0 then INSERT .. 
COMMIT 

將由一個很大的這個表鎖衝擊性能?有沒有更好的方法來解決我的問題沒有表鎖?

使用DB2數據庫和Java客戶端 - 實際上Hibernate是否重要。

回答

2

我會爲每個事件插入一行,並每隔24小時運行一次腳本,以聚合信息並將聚合在一個單獨的表中。這是OLAP(分析服務等)的經典方法。

由於您有很多輸入,請考慮使用較少限制的鎖(here是db2的事務鎖)。畢竟,如果您的彙總結果在幾百個輸入中沒有輸入,那就不是那麼糟糕了。

+0

謝謝。我只是關於如何聚合到同一個表中,但另一個表更有意義。它會使事情變得複雜一些,因爲我不得不在時間範圍內進行分割,但我認爲這是可行的。 – 2013-02-13 14:30:34

+0

擁有單獨的表格將使解決方案更具可擴展性 - 將來您可能希望將聚合信息表移動到單獨的數據庫或甚至單獨的計算機。 – 2013-02-13 16:35:43

+0

是的。可能是一個好主意。 – 2013-02-13 17:11:25

0

我不太瞭解DB2,但在Oracle中有插入/更新行或語句級別觸發器。所以,每次用戶插入/更新一行觸發器都會觸發並且不會執行。 (行級觸發器)就像在你的情況下更新一些日誌或其他表。不確定此功能在DB2中是否可用。只是FYI ...