如何从Java中释放Informix锁

如何从Java中释放Informix锁,java,informix,Java,Informix,有没有办法从Java中释放Informix中的锁 [Error Code: -107, SQL State: IX000] ISAM error: record is locked 在我们的测试环境中,我们有很多锁异常,解决它的唯一方法是重新启动数据库 PS:我不是在寻找数据库专家的解决方案。我想从Java或Groovy中解决这个问题。发生的是另一个用户锁定了您想要的记录;这通常是暂时的,使用 这就足够了 但使用索引可以避免此错误,如果索引已经存在,则数据分布已过时,您需要更新统计数据 你真

有没有办法从Java中释放Informix中的锁

[Error Code: -107, SQL State: IX000]  ISAM error: record is locked
在我们的测试环境中,我们有很多锁异常,解决它的唯一方法是重新启动数据库


PS:我不是在寻找数据库专家的解决方案。我想从Java或Groovy中解决这个问题。

发生的是另一个用户锁定了您想要的记录;这通常是暂时的,使用 这就足够了

但使用索引可以避免此错误,如果索引已经存在,则数据分布已过时,您需要更新统计数据

你真的应该和你的DBA谈谈这种行为

要查找在相关表上具有锁的会话,可以使用:

选择*
来自sysmaster:syslocks
其中dbsname=“”
和tabname='';
要终止会话,您必须能够发出命令


这不是一个好的实践,即使它是一个测试环境。测试环境的目的是调试,而不是调试。但是反弹ID都不是一个好的做法。

一些可能的解决方案:

  • DBA应该检查测试环境中的and,并将其与生产环境进行比较。看起来您的测试环境上的锁级别可能太宽了。在这种情况下,将锁级别设置为行而不是页或表应该会有所帮助

  • 调整会话的时间间隔(例如,打开连接时可以执行将隔离设置为脏读)。如果在读取数据时出现错误,这会有所帮助,但在使用脏读时要小心,因为可能会遇到重影记录

  • 如前所述,调整等待时间以使锁柜有机会释放锁(在打开连接时执行SET lock MODE to WAIT 5;这将使线程的执行时间最多为5秒,如果记录仍被锁定,则会引发错误)


  • 你首先要检查数据库上的锁为什么在那里……是的,我知道,但当这个锁发生时,我需要杀死他并尝试另一种方法来修复它否;你不需要杀掉一些东西——你需要确保你的所有代码都表现良好,并且在处理完对象后释放锁。这可能意味着强制提交操作。Java有垃圾收集,清理时间不是很确定;这可能会使这里的生活复杂化。但是,正确编写的代码不会在锁上保留很长时间,因此很少有机会运行到另一个进程的锁上。
    SELECT  * 
    FROM    sysmaster:syslocks
    WHERE   dbsname     = '<DATABASE>'
            AND tabname = '<TABLE>';