间隔采样统计数据到数据库中

时间:2013-02-13 12:27:39

标签: sql concurrency statistics db2

在我的应用程序中触发了许多不同类型的事件 - 我想随着时间的推移将它们计算在内以便跟踪。

我正试图找出最好的方法来做到这一点。我将有多个服务器和线程保存事件,因此它必须在并发期间工作。

每个事件我不能有一行,因为事件的数量非常大,必须以某种方式聚合。

所以,我试图为每个事件类型和“时间间隔”(如

)创建一个表行
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 个答案:

答案 0 :(得分:2)

我会为每个事件插入一行,并每隔24小时左右运行一个脚本,聚合信息并将聚合放在一个单独的表中。这是OLAP(analisys服务等)的经典方式。

由于您有许多输入,请考虑使用限制较少的锁(here是db2的事务锁)。毕竟,如果您的汇总结果错过了数百个中的一些条目,那就不是那么糟糕了。

答案 1 :(得分:0)

我对DB2知之甚少,但在Oracle中有插入/更新行或语句级触发器。因此,每次用户插入/更新行触发器时都会触发并执行smth。 (行级触发器)就像更新一些日志或其他表一样。不确定DB2中是否提供此功能。仅供参考......