2013-02-13 49 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 ...