【发布时间】:2013-01-29 00:00:35
【问题描述】:
在我的应用程序中触发了许多不同类型的事件 - 我想随着时间的推移对它们进行计数以进行跟踪。
我正在尝试找出最好的方法来做到这一点。我将有多个服务器和线程保存事件,所以它必须在并发期间工作。
我不能每个事件只有一行,因为事件的数量非常多,必须以某种方式聚合。
所以,我试图为每个事件类型和“时间间隔”设置一个表格行
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 客户端——如果重要的话,实际上是休眠。
【问题讨论】:
标签: sql concurrency statistics db2