Java “表中的并发更新”;SYS";:h2数据库在插入多条记录时失败

Java “表中的并发更新”;SYS";:h2数据库在插入多条记录时失败,java,database,h2,Java,Database,H2,我在h2数据库1.4.197中遇到以下错误。基本上,我正在尝试在处理记录时立即更新它 我使用的不是insert,而是merge语句,因为我不想要重复的记录。以下是我的疑问: 合并到tableName键(col1,col2)值(?,,?); 我正在使用连接池,最大连接池设置为100,通过调试,我发现错误是按随机顺序抛出的。话虽如此,第一次抛出错误是在插入第1000条记录时。在第二次执行时,它以554记录发生 这是我的连接字符串: jdbc:h2:文件:“+DB_NAME+”;MV_STORE=t

我在h2数据库1.4.197中遇到以下错误。基本上,我正在尝试在处理记录时立即更新它

我使用的不是insert,而是merge语句,因为我不想要重复的记录。以下是我的疑问:

合并到tableName键(col1,col2)值(?,,?);

我正在使用连接池,最大连接池设置为100,通过调试,我发现错误是按随机顺序抛出的。话虽如此,第一次抛出错误是在插入第1000条记录时。在第二次执行时,它以554记录发生

这是我的连接字符串:

jdbc:h2:文件:“+DB_NAME+”;MV_STORE=true;MVCC=真;自动_服务器=TRUE

下面是stacktrace

org.h2.jdbc.JdbcSQLException: General error: "java.lang.RuntimeException: Unexpected code path" [50000-197]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
    at org.h2.message.DbException.get(DbException.java:168)
    at org.h2.message.DbException.convert(DbException.java:307)
    at org.h2.message.DbException.toSQLException(DbException.java:280)
    at org.h2.message.TraceObject.logAndConvert(TraceObject.java:357)
    at org.h2.jdbc.JdbcPreparedStatement.execute(JdbcPreparedStatement.java:268)
    at com.verscend.dxcg.reports.db.h2.QueryHelper.insertOrUpdateTable(QueryHelper.java:20)
    at com.verscend.dxcg.audit.AuditLogGenerator.process(AuditLogGenerator.java:22)
    at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:103)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.component.seda.SedaConsumer.sendToConsumers(SedaConsumer.java:298)
    at org.apache.camel.component.seda.SedaConsumer.doRun(SedaConsumer.java:207)
    at org.apache.camel.component.seda.SedaConsumer.run(SedaConsumer.java:154)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.RuntimeException: Unexpected code path
    at org.h2.message.DbException.throwInternalError(DbException.java:254)
    at org.h2.message.DbException.throwInternalError(DbException.java:267)
    at org.h2.engine.Session.unlockAll(Session.java:985)
    at org.h2.engine.Session.endTransaction(Session.java:760)
    at org.h2.engine.Session.commit(Session.java:708)
    at org.h2.command.Command.stop(Command.java:157)
    at org.h2.command.CommandContainer.stop(CommandContainer.java:122)
    at org.h2.command.Command.executeUpdate(Command.java:296)
    at org.h2.jdbc.JdbcPreparedStatement.execute(JdbcPreparedStatement.java:249)
    ... 23 more

org.h2.jdbc.JdbcSQLException: Concurrent update in table "SYS": another transaction has updated or deleted the same row [90131-197]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
    at org.h2.message.DbException.get(DbException.java:179)
    at org.h2.message.DbException.get(DbException.java:155)
    at org.h2.table.RegularTable.removeRow(RegularTable.java:375)
    at org.h2.engine.Database.removeMeta(Database.java:985)
    at org.h2.engine.Database.updateMeta(Database.java:1698)
    at org.h2.command.ddl.Analyze.analyzeTable(Analyze.java:136)
    at org.h2.engine.Session.commit(Session.java:701)
    at org.h2.command.Command.stop(Command.java:157)
    at org.h2.command.CommandContainer.stop(CommandContainer.java:122)
    at org.h2.command.Command.executeUpdate(Command.java:296)
    at org.h2.jdbc.JdbcPreparedStatement.execute(JdbcPreparedStatement.java:249)
    at com.verscend.dxcg.reports.db.h2.QueryHelper.insertOrUpdateTable(QueryHelper.java:20)
    at com.verscend.dxcg.audit.AuditLogGenerator.process(AuditLogGenerator.java:22)
    at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:103)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:541)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:198)
    at org.apache.camel.component.seda.SedaConsumer.sendToConsumers(SedaConsumer.java:298)
    at org.apache.camel.component.seda.SedaConsumer.doRun(SedaConsumer.java:207)
    at org.apache.camel.component.seda.SedaConsumer.run(SedaConsumer.java:154)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)
`
我错过了什么

我找到了解决此问题的临时方法:

如果在插入记录时引发异常(大约每5-10.000条记录发生一次,似乎是随机的),线程将等待10毫秒,然后重试插入记录。如果重试也失败,则会向上传播异常,并且不会插入记录


到目前为止,等待和重试似乎给了数据库足够的时间来解锁有问题的记录。

我遇到了类似的问题。您找到解决方案了吗?我在同一版本(1.4.197)中遇到了相同的问题,并且我使用了一个数据库连接,在该连接中,我使用一个重复使用的PreparedStatement插入了大量记录。insert使用标准insert SQL语句。