Thomas,
I have also encountered this problem very recently. Below is some
code and a few items from our logs. Using H2 version 1.65 and jre
1.6u3. Unfortunately this did not halt our application but instead
filled up our logs in hopes we'd be able to troubleshoot the error
later. This particular piece of code runs millions of times an hour
for months at a time so repeating the error might be unrealistic.
The code that generated this error looked somewhat like this:
private static final String DELETE_QUERY =
"DELETE FROM MESSAGE_QUEUE WHERE ID = ?";
PreparedStatement deleteStmt = conn.prepareStatement(
DELETE_QUERY);
for (int i = 0; i < counts.length; ++i) {
if (counts[i] != Statement.EXECUTE_FAILED) {
deleteStmt.setLong(1, keys[i]);
deleteStmt.executeUpdate(); // Line 288
++count;
}
}
And a small sampling of logs including the first exception -
21:27:09 ERROR [EmbeddedJdbcStatementQueue:Outbound Dispatcher
Thread-6] - processByBatch failed
org.h2.jdbc.JdbcSQLException: Cannot delete file E:\xxxx\xxxParser\data
\queue.2916.log.db [90025-66]
at org.h2.message.Message.getSQLException(Message.java:89)
at org.h2.message.Message.getSQLException(Message.java:93)
at org.h2.message.Message.getSQLException(Message.java:71)
at org.h2.store.fs.FileSystemDisk.delete(FileSystemDisk.java:129)
at org.h2.util.FileUtils.delete(FileUtils.java:181)
at org.h2.log.LogFile.close(LogFile.java:393)
at org.h2.log.LogSystem.closeOldFile(LogSystem.java:225)
at org.h2.log.LogSystem.flushAndCloseUnused(LogSystem.java:119)
at org.h2.log.LogSystem.checkpoint(LogSystem.java:411)
at org.h2.log.LogSystem.add(LogSystem.java:398)
at org.h2.store.DiskFile.removeRecord(DiskFile.java:755)
at org.h2.store.Storage.removeRecord(Storage.java:154)
at org.h2.index.ScanIndex.remove(ScanIndex.java:160)
at org.h2.table.TableData.removeRow(TableData.java:290)
at org.h2.command.dml.Delete.update(Delete.java:67)
at org.h2.command.CommandContainer.update(CommandContainer.java:68)
at org.h2.command.Command.executeUpdate(Command.java:171)
at
org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:
127)
at
org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:
116)
at
xxx.xxxx.xxxx.parser.queue.jdbc.EmbeddedJdbcStatementQueue.doBatch(EmbeddedJdbcStatementQueue.java:
288)
at
xxx.xxxx.xxxx.parser.queue.jdbc.EmbeddedJdbcStatementQueue.processByHash(EmbeddedJdbcStatementQueue.java:
227)
at
xxx.xxxx.xxxx.parser.OutboundDispatcher.handleStatement(OutboundDispatcher.java:
185)
at xxx.xxxx.xxxx.parser.OutboundDispatcher
$Worker.processBoundry(OutboundDispatcher.java:255)
at xxx.xxxx.xxxx.parser.OutboundDispatcher
$Worker.run(OutboundDispatcher.java:227)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown
Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
21:27:10 ERROR [EmbeddedJdbcStatementQueue:Inbound Dispatcher
Thread-47] - Enqueue failed
org.h2.jdbc.JdbcSQLException: General error: java.lang.Error: rowCount
expected 10 got 9 [50000-66]
at org.h2.message.Message.getSQLException(Message.java:89)
at org.h2.message.Message.convert(Message.java:174)
at org.h2.table.TableData.addRow(TableData.java:129)
at org.h2.command.dml.Insert.update(Insert.java:88)
at org.h2.command.CommandContainer.update(CommandContainer.java:68)
at org.h2.command.Command.executeUpdate(Command.java:171)
at
org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:
127)
at
org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:
116)
at
xxx.xxxx.xxxx.parser.queue.jdbc.EmbeddedJdbcStatementQueue.enqueue(EmbeddedJdbcStatementQueue.java:
212)
at
xxx.xxxx.xxxx.parser.InboundDispatcher.enqueueMessage(InboundDispatcher.java:
290)
at
xxx.xxxx.xxxx.parser.ClusteredInboundDispatcher.enqueueMessage(ClusteredInboundDispatcher.java:
62)
at xxx.xxxx.xxxx.parser.InboundDispatcher
$Worker.processMessage(InboundDispatcher.java:465)
at xxx.xxxx.xxxx.parser.InboundDispatcher
$Worker.run(InboundDispatcher.java:431)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown
Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.Error: rowCount expected 10 got 9
at org.h2.message.Message.getInternalError(Message.java:126)
at org.h2.table.TableData.addRow(TableData.java:102)
... 13 more
21:27:10 ERROR [EmbeddedJdbcStatementQueue:Inbound Dispatcher
Thread-47] - Enqueue failed
org.h2.jdbc.JdbcSQLException: General error: java.lang.Error: rowCount
expected 10 got 9 [50000-66]
at org.h2.message.Message.getSQLException(Message.java:89)
at org.h2.message.Message.convert(Message.java:174)
at org.h2.table.TableData.addRow(TableData.java:129)
at org.h2.command.dml.Insert.update(Insert.java:88)
at org.h2.command.CommandContainer.update(CommandContainer.java:68)
at org.h2.command.Command.executeUpdate(Command.java:171)
at
org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:
127)
at
org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:
116)
at
xxx.xxxx.xxxx.parser.queue.jdbc.EmbeddedJdbcStatementQueue.enqueue(EmbeddedJdbcStatementQueue.java:
212)
at
xxx.xxxx.xxxx.parser.InboundDispatcher.enqueueMessage(InboundDispatcher.java:
290)
at
xxx.xxxx.xxxx.parser.ClusteredInboundDispatcher.enqueueMessage(ClusteredInboundDispatcher.java:
62)
at xxx.xxxx.xxxx.parser.InboundDispatcher
$Worker.processMessage(InboundDispatcher.java:465)
at xxx.xxxx.xxxx.parser.InboundDispatcher
$Worker.run(InboundDispatcher.java:431)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown
Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.Error: rowCount expected 10 got 9
at org.h2.message.Message.getInternalError(Message.java:126)
at org.h2.table.TableData.addRow(TableData.java:102)
... 13 more
21:27:10 ERROR [EmbeddedJdbcStatementQueue:Outbound Dispatcher
Thread-1] - processByBatch failed
org.h2.jdbc.JdbcSQLException: General error: java.lang.Error: File ID
mismatch got=0 expected=23 pos=261 true org.h2.store.DiskFile:E:\xxxx
\xxxParser\data\queue.data.db blockCount:0 [50000-66]
at org.h2.message.Message.getSQLException(Message.java:89)
at org.h2.message.Message.convert(Message.java:174)
at org.h2.command.Command.executeQueryLocal(Command.java:120)
at org.h2.command.Command.executeQuery(Command.java:106)
at
org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:
89)
at
xxx.xxxx.xxxx.parser.queue.jdbc.EmbeddedJdbcStatementQueue.doBatch(EmbeddedJdbcStatementQueue.java:
250)
at
xxx.xxxx.xxxx.parser.queue.jdbc.EmbeddedJdbcStatementQueue.processByHash(EmbeddedJdbcStatementQueue.java:
227)
at
xxx.xxxx.xxxx.parser.OutboundDispatcher.handleStatement(OutboundDispatcher.java:
185)
at xxx.xxxx.xxxx.parser.OutboundDispatcher
$Worker.processBoundry(OutboundDispatcher.java:255)
at xxx.xxxx.xxxx.parser.OutboundDispatcher
$Worker.run(OutboundDispatcher.java:227)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown
Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.Error: File ID mismatch got=0 expected=23 pos=261
true org.h2.store.DiskFile:E:\xxxx\xxxParser\data\queue.data.db
blockCount:0
at org.h2.message.Message.getInternalError(Message.java:126)
at org.h2.store.DiskFile.getRecord(DiskFile.java:456)
at org.h2.store.Storage.getRecord(Storage.java:65)
at org.h2.index.ScanIndex.getRow(ScanIndex.java:94)
at org.h2.table.TableData.getRow(TableData.java:85)
at org.h2.index.BtreeIndex.getRow(BtreeIndex.java:266)
at org.h2.index.BtreeCursor.get(BtreeCursor.java:65)
at org.h2.table.TableFilter.getValue(TableFilter.java:550)
at org.h2.expression.ExpressionColumn.getValue(ExpressionColumn.java:
163)
at org.h2.command.dml.Select.queryFlat(Select.java:329)
at org.h2.command.dml.Select.queryWithoutCache(Select.java:386)
at org.h2.command.dml.Query.query(Query.java:227)
at org.h2.command.CommandContainer.query(CommandContainer.java:77)
at org.h2.command.Command.executeQueryLocal(Command.java:118)
... 10 more
21:27:10 ERROR [EmbeddedJdbcStatementQueue:Inbound Dispatcher
Thread-47] - Enqueue failed
org.h2.jdbc.JdbcSQLException: General error: java.lang.Error: try to
add a record twice i=0 [50000-66]
at org.h2.message.Message.getSQLException(Message.java:89)
at org.h2.message.Message.convert(Message.java:174)
at org.h2.table.TableData.addRow(TableData.java:129)
at org.h2.command.dml.Insert.update(Insert.java:88)
at org.h2.command.CommandContainer.update(CommandContainer.java:68)
at org.h2.command.Command.executeUpdate(Command.java:171)
at
org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:
127)
at
org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:
116)
at
xxx.xxxx.xxxx.parser.queue.jdbc.EmbeddedJdbcStatementQueue.enqueue(EmbeddedJdbcStatementQueue.java:
212)
at
xxx.xxxx.xxxx.parser.InboundDispatcher.enqueueMessage(InboundDispatcher.java:
290)
at
xxx.xxxx.xxxx.parser.ClusteredInboundDispatcher.enqueueMessage(ClusteredInboundDispatcher.java:
62)
at xxx.xxxx.xxxx.parser.InboundDispatcher
$Worker.processMessage(InboundDispatcher.java:465)
at xxx.xxxx.xxxx.parser.InboundDispatcher
$Worker.run(InboundDispatcher.java:431)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown
Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.Error: try to add a record twice i=0
at org.h2.message.Message.getInternalError(Message.java:126)
at org.h2.util.CacheLRU.put(CacheLRU.java:51)
at org.h2.store.DiskFile.addRecord(DiskFile.java:768)
at org.h2.store.Storage.addRecord(Storage.java:141)
at org.h2.index.ScanIndex.add(ScanIndex.java:111)
at org.h2.table.TableData.addRow(TableData.java:97)
... 13 more
21:27:10 ERROR [EmbeddedJdbcStatementQueue:Outbound Dispatcher
Thread-6] - processByBatch failed
org.h2.jdbc.JdbcSQLException: General error: java.lang.Error: File ID
mismatch got=0 expected=23 pos=261 true org.h2.store.DiskFile:E:\xxxx
\xxxParser\data\queue.data.db blockCount:0 [50000-66]
at org.h2.message.Message.getSQLException(Message.java:89)
at org.h2.message.Message.convert(Message.java:174)
at org.h2.command.Command.executeQueryLocal(Command.java:120)
at org.h2.command.Command.executeQuery(Command.java:106)
at
org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:
89)
at
xxx.xxxx.xxxx.parser.queue.jdbc.EmbeddedJdbcStatementQueue.doBatch(EmbeddedJdbcStatementQueue.java:
250)
at
xxx.xxxx.xxxx.parser.queue.jdbc.EmbeddedJdbcStatementQueue.processByHash(EmbeddedJdbcStatementQueue.java:
227)
at
xxx.xxxx.xxxx.parser.OutboundDispatcher.handleStatement(OutboundDispatcher.java:
185)
at xxx.xxxx.xxxx.parser.OutboundDispatcher
$Worker.processBoundry(OutboundDispatcher.java:255)
at xxx.xxxx.xxxx.parser.OutboundDispatcher
$Worker.run(OutboundDispatcher.java:227)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown
Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.Error: File ID mismatch got=0 expected=23 pos=261
true org.h2.store.DiskFile:E:\xxxx\xxxParser\data\queue.data.db
blockCount:0
at org.h2.message.Message.getInternalError(Message.java:126)
at org.h2.store.DiskFile.getRecord(DiskFile.java:456)
at org.h2.store.Storage.getRecord(Storage.java:65)
at org.h2.index.ScanIndex.getRow(ScanIndex.java:94)
at org.h2.table.TableData.getRow(TableData.java:85)
at org.h2.index.BtreeIndex.getRow(BtreeIndex.java:266)
at org.h2.index.BtreeCursor.get(BtreeCursor.java:65)
at org.h2.table.TableFilter.getValue(TableFilter.java:550)
at org.h2.expression.ExpressionColumn.getValue(ExpressionColumn.java:
163)
at org.h2.command.dml.Select.queryFlat(Select.java:329)
at org.h2.command.dml.Select.queryWithoutCache(Select.java:386)
at org.h2.command.dml.Query.query(Query.java:227)
at org.h2.command.CommandContainer.query(CommandContainer.java:77)
at org.h2.command.Command.executeQueryLocal(Command.java:118)
... 10 more
Regards,
Dan