java.lang.NullPointerException when opening database

1,568 views
Skip to first unread message

Herman Banken

unread,
Nov 30, 2016, 11:59:35 PM11/30/16
to H2 Database
When opening the database after a forced stop (hanging SELECT) it fails with a NPE. This is using IntelliJ's built-in browser which uses the h2-1.4.193.jar driver jar. Same holds for when connecting using Play Frameworks Slick, but instead of the error you'll only see the 1s timeout.

My database is too large to be send (1.5GB) and takes too long to trash and regenerate, so I hope to be able to restore the database in some way.

Stacktrace:

[HY000][50000] General error: "java.lang.NullPointerException" [50000-193]
java.lang.NullPointerException
at org.h2.mvstore.db.ValueDataType.compare(ValueDataType.java:102)
at org.h2.mvstore.MVMap.compare(MVMap.java:708)
at org.h2.mvstore.Page.binarySearch(Page.java:334)
at org.h2.mvstore.MVMap.binarySearch(MVMap.java:461)
at org.h2.mvstore.MVMap.get(MVMap.java:450)
at org.h2.mvstore.db.TransactionStore.commit(TransactionStore.java:349)
at org.h2.mvstore.db.TransactionStore$Transaction.commit(TransactionStore.java:779)
at org.h2.mvstore.db.MVTableEngine$Store.initTransactions(MVTableEngine.java:253)
at org.h2.engine.Database.open(Database.java:765)
at org.h2.engine.Database.openDatabase(Database.java:273)
at org.h2.engine.Database.<init>(Database.java:267)
at org.h2.engine.Engine.openSession(Engine.java:64)
at org.h2.engine.Engine.openSession(Engine.java:176)
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:154)
at org.h2.engine.Engine.createSession(Engine.java:137)
at org.h2.engine.Engine.createSession(Engine.java:27)
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:349)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:115)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:99)
at org.h2.Driver.connect(Driver.java:69)
at com.intellij.database.remote.jdbc.impl.RemoteDriverImpl.connect(RemoteDriverImpl.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
at sun.rmi.transport.Transport$1.run(Transport.java:200)
at sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$256(TCPTransport.java:683)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
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:745)

Running java -cp /Users/user/.ivy2/cache/com.h2database/h2/jars/h2-1.4.193.jar org.h2.tools.Recover -db database -trace
fails with a unsupported data type 17 exception.

Kenton Garner

unread,
Dec 5, 2016, 12:02:15 PM12/5/16
to H2 Database
I had the same issue with a production database...
I am using v191.

I found a posting on stackoverflow h2-general-error-java-lang-nullpointerexception-50000-182 
There was a possible solution posted by Justin Nguyen that worked for me.
He suggested creating a custom class to cleanup the undo log and this fixed my issue.
public static void main(final String[] args) {
   
// open the store (in-memory if fileName is null)
   
final MVStore store = MVStore.open("C:\\temp\\h2db.mv.db");

   
final MVMap<Object, Object> openMap = store.openMap("undoLog");

    openMap
.clear();

   
// close the store (this will persist changes)
    store
.close();
}


This does not explain why the problem is occurring, but it allowed me to move forward.  It appears this error has been happening for a while - I have seen it referenced with much older version numbers as well.
I saw one comment that made it appear it was caused by shutting down immediately ( ie power loss ).  That was not my case, but perhaps 
Thomas can speak to it better.

schol...@outlook.de

unread,
Jan 17, 2017, 6:16:13 AM1/17/17
to H2 Database
This seems to be the same issue as https://github.com/h2database/h2database/issues/304, please see comment from 17 Jan 2017.

It seems that H2 may corrupt the database file when being interrupted while buffering a large result set to disk.
Reply all
Reply to author
Forward
0 new messages