我有一个uuid表,其中包含四列:id,uuid,used(true / false)和用于乐观锁定的版本。大约有10000条记录。当我想向桌子人插入新人时,我首先从桌子中读取了未使用过的uuid。然后,我更新此已使用的记录并插入新人员。但是,当我运行性能测试时,我在使用表uuid以及选择或更新记录时遇到问题。有很多超时锁定ISAM错误:
Caused by: java.sql.SQLException: ISAM error: Lock Timeout Expired
at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:413) ~[ifxjdbc.jar:?]
at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3982) ~[ifxjdbc.jar:?]
at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2698) ~[ifxjdbc.jar:?]
at com.informix.jdbcx.IfxXASqli.receiveMessage(IfxXASqli.java:116) ~[ifxjdbcx.jar:?]
at com.informix.jdbc.IfxSqli.executeCommand(IfxSqli.java:939) ~[ifxjdbc.jar:?]
at com.informix.jdbc.IfxResultSet.b(IfxResultSet.java:304) ~[ifxjdbc.jar:?]
at com.informix.jdbc.IfxStatement.c(IfxStatement.java:1283) ~[ifxjdbc.jar:?]
at com.informix.jdbc.IfxPreparedStatement.executeUpdate(IfxPreparedStatement.java:421) ~[ifxjdbc.jar:?]
at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.pmiExecuteUpdate(WSJdbcPreparedStatement.java:1187) ~[com.ibm.ws.runtime.jar:?]
at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.executeUpdate(WSJdbcPreparedStatement.java:804) ~[com.ibm.ws.runtime.jar:?]
我如何避免这种异常?网站中的隔离级别设置为TRANSACTION_READ_COMMITTED锁定模式,等待时间设置为2s,并且表具有行锁定
2秒的超时时间非常短。您正在使用多少个并发线程进行测试?我敢打赌,您几乎没有时间在2s到期之前提交。使用30s,并修改您的代码以从uuid表中获取下一个值,并尽快提交!不要执行其他工作。我建议分配一个新的uuid,插入新的用户行并提交。然后继续其他工作。
另外,添加用户并不会令我感到震惊,因为需要对并发活动进行严格的性能测试。但是,如果要在另一个将被大量访问的表上使用此技术,则可能会遇到真正的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句