【问题标题】:Interval Sampling statistics into Database间隔抽样统计到数据库
【发布时间】: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


    【解决方案1】:

    我对 DB2 了解不多,但在 Oracle 中有插入/更新行或语句级触发器。因此,每次用户插入/更新行触发器时都会触发并执行 smth。 (行级触发器)就像你的情况一样更新一些日志或其他表。不确定这个特性在 DB2 中是否可用。仅供参考...

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢。我只是想知道如何聚合到同一个表中,但另一个表更有意义。这会让事情变得有点复杂,因为我必须在时间范围内对其进行切片,但我想这是可行的。
      • 拥有单独的表将使解决方案更具可扩展性 - 将来您可能希望将聚合的信息表移动到单独的数据库甚至单独的机器上。
      猜你喜欢
      • 2012-10-08
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 2015-12-14
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多