在某种情况下我收到以下错误
当一个不同的线程通过批量上传操作填充了很多用户时,我试图查看不同网页上所有用户的列表.列表查询会引发以下超时错误.有没有办法设置此超时,以便我可以避免此超时错误.
环境:h2(最新),Hibernate 3.3.x
Caused by: org.h2.jdbc.JdbcSQLException: Timeout trying to lock table "USER"; SQL statement:
[50200-144]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:327)
at org.h2.message.DbException.get(DbException.java:167)
at org.h2.message.DbException.get(DbException.java:144)
at org.h2.table.RegularTable.doLock(RegularTable.java:482)
at org.h2.table.RegularTable.lock(RegularTable.java:416)
at org.h2.table.TableFilter.lock(TableFilter.java:139)
at org.h2.command.dml.Select.queryWithoutCache(Select.java:571)
at org.h2.command.dml.Query.query(Query.java:257)
at org.h2.command.dml.Query.query(Query.java:227)
at org.h2.command.CommandContainer.query(CommandContainer.java:78)
at org.h2.command.Command.executeQuery(Command.java:132)
at org.h2.server.TcpServerThread.process(TcpServerThread.java:278)
at org.h2.server.TcpServerThread.run(TcpServerThread.java:137)
at java.lang.Thread.run(Thread.java:619)
at org.h2.engine.SessionRemote.done(SessionRemote.java:543)
at org.h2.command.CommandRemote.executeQuery(CommandRemote.java:152)
at org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:96)
at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:342)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1808)
at org.hibernate.loader.Loader.doQuery(Loader.java:697)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.doList(Loader.java:2228)
... 125 more
Run Code Online (Sandbox Code Playgroud)
小智 39
我遇到了相同的问题并使用参数"MVCC = true",它解决了它.您可以在H2文档中找到有关此参数的更多说明:http://www.h2database.com/html/advanced.html#mvcc
对于那些在集成测试中遇到此问题的人(即服务器正在访问h2 db,而集成测试在调用服务器之前正在访问db,以准备测试),请在测试之前执行的脚本中添加“提交”,以确保调用服务器之前,数据已存储在数据库中(没有MVCC = true,如果默认情况下未启用,我会发现它有点“怪异”)。
我想建议,如果您收到此错误,那么也许您不应该在批量数据库操作上使用事务.考虑在每次更新时进行交易:将整个批量导入视为交易是否有意义?可能不是.如果是,则是,MVCC = true或更大的锁定超时是合理的解决方案.
但是,我认为在大多数情况下,您会看到此错误,因为您尝试执行一个非常长的事务 - 换句话说,您不知道您正在执行一个非常长的事务.对我来说当然就是这种情况,我只是更加关注我如何编写记录(使用无事务或使用较小的事务)并解决了锁定超时问题.
| 归档时间: |
|
| 查看次数: |
39476 次 |
| 最近记录: |