2010-11-24 160 views
1

我们的J2EE web应用程序针对Informix 9.40运行。Informix表被锁定

有时候一个表被锁定,然后任何有SQL代码访问这个表的JSP都会返回一个错误。我知道如何使用onstat -k来查看当前的锁,但我想知道是否有任何方法可以跟踪 历史中发生的所有锁以及导致表锁的相关会话和SQL语句?

因为我不知道什么时候同样的错误会发生下一次......

回答

2

首先,你应该知道,IBM Informix Dynamic Server的(IDS)版本9.40不再受IBM的支持;后继版本10.00也不是。你应该计划升级到11.70,可能只是11.50。

没有一种全面跟踪锁的方法。其中一个原因是,这种跟踪会对系统造成相当大的放缓 - 非常显着的放缓。这些锁通常是共享内存的第二大组成部分(位于包含数据页的缓冲池之后),因此它们有很多,它们通常非常活跃,并且锁通常是暂时性的(对于小部分一秒,甚至几分之一毫秒)。从这种日志记录生成的数据量非常大,很难筛选。

如果您使用的是更高版本,可能会有一些选项可以帮助DB-Cron和Admin API(不是那么肯定,但机会会更好),但对于9.40,选项是相当严格的限制。

我能想到的最接近的方法是使用onstat -k -u -r 1快照。 -k报告锁定表(如你所知); -u报告用户(会话),并且-r 1每秒重复一次该命令。您可以根据需要添加其他数据请求; -g ses将提供更详细的会话报告(如果您是DBSA,运行该命令时通常是用户informix)。但是这是1秒的采样......唯一的好消息是,当把锁放在桌子上时,它很可能会暂停一段时间(因为你注意到了问题),所以-g ses-u输出会告诉你谁或什么适用锁。但是,过渡期的数据量会很大。

您需要检查系统周围的所有SQL,查找表锁定的东西。时间有没有一致性?例如,它可以是由cron作业运行的UPDATE STATISTICS吗?我相信这可以瞬间获得表锁。它也是自你的IDS版本以来在版本中得到了改进的东西。

+2

您必须是informix专家!非常感谢,我学到了很多东西。 – idiotgenius 2010-12-27 11:06:09