Hi Thomas,
I encountered such exception quite often and don't know what's the root cause yet, I'm using h2-1.3.159. The exception looks like below.
org.h2.jdbc.JdbcSQLException: The database is read only [90097-159]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
at org.h2.message.DbException.get(DbException.java:169)
at org.h2.message.DbException.get(DbException.java:146)
at org.h2.message.DbException.get(DbException.java:135)
at org.h2.engine.Database.checkWritingAllowed(Database.java:1626)
at org.h2.store.PageStore.logUndo(PageStore.java:996)
at org.h2.index.PageDataLeaf.create(PageDataLeaf.java:92)
at org.h2.index.PageDataIndex.getPage(PageDataIndex.java:227)
at org.h2.index.PageDataIndex. (PageDataIndex.java:81)
at org.h2.table.RegularTable. (RegularTable.java:92)
at org.h2.store.PageStore.openMetaIndex(PageStore.java:1511)
at org.h2.store.PageStore.recover(PageStore.java:1328)
at org.h2.store.PageStore.openExisting(PageStore.java:349)
at org.h2.store.PageStore.open(PageStore.java:273)
at org.h2.engine.Database.getPageStore(Database.java:2049)
at org.h2.engine.Database.open(Database.java:553)
at org.h2.engine.Database.openDatabase(Database.java:220)
at org.h2.engine.Database. (Database.java:215)
at org.h2.engine.Engine.openSession(Engine.java:56)
at org.h2.engine.Engine.openSession(Engine.java:159)
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:138)
at org.h2.engine.Engine.createSession(Engine.java:121)
at org.h2.engine.Engine.createSession(Engine.java:28)
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:285)
at org.h2.jdbc.JdbcConnection. (JdbcConnection.java:110)
at org.h2.jdbc.JdbcConnection. (JdbcConnection.java:94)
at org.h2.Driver.connect(Driver.java:72)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at
My case is just like what this post mentioned. I'm trying open a database with ACCESS_MODE_DATA=R using embedded mode, and then some time this error raised and persisted unless I restart my application.
So, my question is can I safely change to a read write mode when this error occurred? Like:
Connection conn = null;
try {
conn = DriverManager.getConnection("jdbc:h2:/home/data/test;ACCESS_MODE_DATA=r", "sa", "");
} catch (org.h2.jdbc.JdbcSQLException e) {
if (e.getMessage().contains("The database is read only"))
conn = DriverManager.getConnection("jdbc:h2:/home/data/test;ACCESS_MODE_DATA=r", "sa", "");
else
throw new RuntimeException(e);
}
Best Regards,
Steve