58 Stimmen

H2-Datenbankfehler: Datenbank ist möglicherweise bereits in Verwendung: "Durch einen anderen Prozess gesperrt"

Ich versuche, die H2-Datenbank von einer Java-Anwendung aus zu verwenden.

Ich habe die Datenbank und ihre Tabellen über die H2-Konsole erstellt und versuche dann, mich von Java aus zu verbinden, indem ich

Connection con = DriverManager.getConnection("jdbc:h2:~/dbname", "Benutzername", "Passwort");

verwende. Allerdings erhalte ich den folgenden Fehler:

Ausnahme im Thread "main" org.h2.jdbc.JdbcSQLException: Datenbank ist möglicherweise bereits in Benutzung: "Durch einen anderen Prozess gesperrt". Mögliche Lösungen: alle anderen Verbindungen schließen; den Servermodus verwenden [90020-161]

Ich habe versucht, die dbname.lock.db-Datei zu löschen, aber sie wird automatisch neu erstellt.

Wie kann ich die Datenbank entsperren, um sie in meinem Java-Programm zu verwenden?

0voto

Grigory Kislin Punkte 14348

Gemäß dem H2-Datenbank-Tutorial können Sie die H2-Datenbank in drei verschiedenen Modi ausführen:

  1. Server-Modus:

jdbc:h2:tcp://localhost/~/test

Bei Verwendung der H2-Datenbank im Servermodus (auch als Client/Server-Modus bekannt) werden alle Daten über TCP/IP übertragen. Bevor eine Anwendung die H2-Datenbank im Servermodus verwenden kann, müssen Sie die H2-Datenbank auf derselben oder einer anderen Maschine starten.

  1. Embedded-Modus:

jdbc:h2:~/test

Die H2-Datenbank im eingebetteten Modus ist schneller, aber der Nachteil ist, dass kein anderer Prozess auf die Datenbank zugreifen kann. In der obigen Verbindungszeichenfolge werden die Daten im Ordner 'test' unter dem Benutzerverzeichnis gespeichert.

  1. Gemischter Modus:

Der gemischte Modus kombiniert einige Funktionen des eingebetteten und des Servermodus. Die erste Anwendung, die sich mit der H2-Datenbank verbindet, macht dies im eingebetteten Modus, startet aber gleichzeitig einen Server, damit andere Anwendungen gleichzeitig auf dieselben Daten zugreifen können, auch aus verschiedenen Prozessen.

jdbc:h2:/data/test;AUTO_SERVER=TRUE

Bei Verwendung des automatischen gemischten Modus können Sie die JDBC-URL für alle Anwendungen teilen, die die Datenbank verwenden. Standardmäßig verwendet der Server einen beliebigen freien TCP-Port. Der Port kann manuell auf AUTO_SERVER_PORT=9090 gesetzt werden.

-1voto

bittap Punkte 405

Ich habe versucht, die Datei dbname.lock.db zu löschen, aber sie wird automatisch neu erstellt. Wie kann ich die Datenbank entsperren, um sie in meinem Java-Programm zu verwenden?

Fügen Sie einfach FILE_LOCK=NO; hinzu. FILE_LOCK=NO erstellt nicht dbname.lock.db.

spring.datasource.url=jdbc:h2:file:./testdb/h2;DB_CLOSE_ON_EXIT=false;FILE_LOCK=NO;

Die Details zur FILE_LOCK Referenz finden Sie hier.

Die Verwendung der Methode NO zwingt die Datenbank, überhaupt keine Sperrdatei zu erstellen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X