The situation: after a db import with the suggested (persistent) setting
LOCK_MODE=0, connecting to the same or another db with the global
setting MULTI_THREADED=1 fails.
One needs to reset the lock mode with LOCK_MODE=3.
This has been noted by
https://groups.google.com/forum/#!msg/h2-database/chvHwUZ20xQ/sYgNWLVSUXQJ and it's the only place after 2 hrs of searching where I've found the solution.
The reason why I did not solve this quicker is because in my setup, I got an SQLException from sqlite instead:
java.sql.SQLException: invalid database address: jdbc:h2:file:c:/h2tempdb;
IFEXISTS=TRUE;ACCESS_MODE_DATA=r;MULTI_THREADED=1
at org.sqlite.JDBC.createConnection(JDBC.java:110)
at org.sqlite.JDBC.connect(JDBC.java:87)
at java.sql.DriverManager.getConnection(DriverManager.java:579)
at java.sql.DriverManager.getConnection(DriverManager.java:243)
at com.optimaize.labs.dbperf.databases.h2.ConnectionTest.run(ConnectionTest.java:54)
at com.optimaize.labs.dbperf.databases.h2.ConnectionTest.thisFails(ConnectionTest.java:26)
It
seems that this happens when I have 2 sql drivers. Java asks each, all
report they can't handle this connection string, and the last one
(sqlite) throws this.
I've created a short reproducible test case here:
https://github.com/fabiankessler/readonly-embedded-dbs-benchmark/blob/master/src/test/java/com/optimaize/labs/dbbench/databases/h2/ConnectionTest.java
Also, I'm wondering why LOCK_MODE=0 is not acceptable when my connection is ACCESS_MODE_DATA=r.