我们的J2EE Web应用程序针对Informix 9.40运行。
有时一个表被锁定,然后任何具有访问该表的SQL代码的JSP都将返回错误。我知道如何使用onstat -k
来查看当前的锁,但我想知道有没有办法跟踪
所有锁都发生在历史记录和导致表锁的相关会话和SQL语句中?
因为我不知道接下来会发生同样的错误......
答案 0 :(得分:2)
首先,您应该知道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
报告用户(会话),-r 1
每秒重复一次命令。您可以根据需要添加其他数据请求; -g ses
会在运行命令时提供更详细的会话报告(如果您是DBSA,通常是用户informix
)。但这是1秒的抽样...唯一的好消息是,当把锁放在桌子上时,它可能会暂停一段时间(因为你注意到了问题),所以-g ses
或{ {1}}输出将告诉您谁应用锁或什么。但是过渡期间的数据量会很大。
您需要查看系统周围的所有SQL,查找表锁定内容。时机有什么一致性吗?例如,可能是由cron作业运行的UPDATE STATISTICS吗?我相信,这会迅速获得表锁;自从您的IDS版本以来,它也在版本中得到了改进。