我们的 J2EE Web 应用程序在 Informix 9.40 上运行。
有时一张表被锁定,然后任何具有 SQL 代码访问该表的 JSP 都会返回错误。我知道如何使用 onstat -k
来查看当前的锁,但我想知道是否有任何方法可以跟踪
历史上发生的所有锁以及导致表锁的相关 session 和SQL语句?
因为我不知道下次什么时候会发生同样的错误...
最佳答案
首先,您应该知道 IBM 不再支持 IBM Informix Dynamic Server (IDS) 版本 9.40;后续版本 10.00 也不是。您应该计划升级,可能升级到 11.70,也可能只是升级到 11.50。
没有一种方法可以全面跟踪锁定。原因之一是这种跟踪会给系统带来相当大的减慢——非常显着的减慢。锁通常是共享内存的第二大组成部分(位于包含数据页的缓冲池之后),因此锁的数量很多,而且它们通常非常活跃,并且锁通常被短暂持有(对于一小部分)一秒,甚至几分之一毫秒)。此类日志记录生成的数据量将非常大,并且非常难以筛选。
如果您使用的是更高版本,可能会有一些选项可以帮助使用 DB-Cron 和 Admin API(不确定,但机会会更好),但在 9.40 中,选项受到相当严格的限制。
我能想到的最接近的方法是使用 onstat -k -u -r 1
进行快照。 -k
报告锁表(正如您所知); -u
报告用户( session ),-r 1
每秒重复该命令。您可以根据需要添加其他数据请求; -g ses
将提供有关 session 的更详细报告(如果您是 DBSA,通常是用户 informix
,在运行该命令时)。但这是 1 秒采样...唯一的好消息是,当将锁放在表上时,它很可能会挂起一段时间(因为您注意到了问题),因此 -g ses
或 -u
输出将告诉您谁或什么应用了锁定。但中间的数据量会很大。
您需要检查系统周围的所有 SQL,寻找表锁定的内容。时间上有一致性吗?例如,它可能是由 cron 作业运行的 UPDATE STATISTICS 吗?我相信,这会很快获得表锁;自您的 IDS 版本以来,它也是在版本中得到改进的。
关于locking - Informix 表已锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4265890/