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?

60voto

Daniel B. Chapman Punkte 4571

H2 läuft immer noch (das kann ich garantieren). Du musst eine TCP-Verbindung für mehrere Benutzer verwenden, wie zum Beispiel - >

ODER

DriverManager.getConnection("jdbc:h2:tcp://localhost/server~/dbname","Benutzername","Passwort");

Dies bedeutet auch, dass du den Server im TCP-Modus starten musst. Ehrlich gesagt, ist dies ziemlich einfach in der Dokumentation beschrieben.

Beende den Prozess erzwingt (javaw.exe für Windows) und stelle sicher, dass alle Anwendungen, die ihn gestartet haben könnten, beendet sind. Du hast ein aktives Sperren.

24voto

Saman Salehi Punkte 900

Ich hatte das gleiche Problem. In Intellj, wenn ich h2 Datenbank verwenden wollte, während mein Programm lief, erhielt ich denselben Fehler. Um dieses Problem zu lösen, änderte ich die Verbindungs-URL von

spring.datasource.url=jdbc:h2:file:~/ipinbarbot

zu:

spring.datasource.url=jdbc:h2:~/ipinbarbot;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE

Und dann war mein Problem verschwunden. Jetzt kann ich auf die "ipinbarbot" Datenbank zugreifen, wenn mein Programm läuft. Wenn Sie Hibernate verwenden, vergessen Sie auch nicht:

spring.jpa.hibernate.ddl-auto = update

viel Glück

19voto

Cal Vin Punkte 191

Ich benutze h2db mit einer Test-T24-tafj-Anwendung. Ich hatte das gleiche Problem, aber ich konnte es lösen, indem ich die Anwendung identifizierte, die h2 ausführt (gestartet, als ich versuchte, eine Datenbankverbindung einzurichten).

ps aux|grep java

gibt die Ausgabe aus:

sysadmin 22755  3.2  0.1 5189724 64008 pts/3   Sl   08:28   0:00 /usr/java/default/bin/java -server -Xmx2048M -XX:MaxPermSize=256M -cp h2-1.3.175.jar:/r14tafj/TAFJ/dbscripts/h2/TAFJFunctions.jar org.h2.tools.Server -tcp -tcpAllowOthers -baseDir /r14tafj/t24/data

Jetzt töten Sie dies mit seiner Prozess-ID:

kill -9 22755

und zuletzt entfernen Sie die Sperrdatei:

rm -f dbname.lock.db

9voto

vimal krishna Punkte 2652

Ich habe einen Hinweis von Saman Salehi oben. Mein Anwendungsfall: Vorbereitung einer REST-Anwendung für das Client-seitige Lastenausgleich (Ausführen zweier JVM-Instanzen von REST). Hier wird meine MVC-Anwendung diese REST-Anwendung aufrufen, die ActiveMQ-Back-End für DATEN hat. Ich hatte das Problem, als ich zwei Instanzen der REST-Anwendung in Eclipse ausgeführt habe und versucht habe, beide Instanzen gleichzeitig mit der folgenden Konfiguration auszuführen

spring.datasource.url=jdbc:h2:file:./Database;
spring.jpa.properties.hibernate.hbm2ddl.auto=update

Nach Hinzufügen von DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE

spring.datasource.url=jdbc:h2:file:./Database;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE

Beide Instanzen laufen und werden im Eureka-Dashboard angezeigt.

Schließen Sie die Datenbank nicht, wenn die VM beendet wird: jdbc:h2:;DB_CLOSE_ON_EXIT=FALSE

Mehrere Prozesse können auf dieselbe Datenbank zugreifen, ohne den Server manuell starten zu müssen; AUTO_SERVER=TRUE

Weitere Informationen: http://www.h2database.com/html/features.html

7voto

Filip Punkte 2156

Sie können auch den Tab "Einstellungen" von der H2-Konsole besuchen und alle aktiven Sitzungen beenden, indem Sie die Schaltfläche "Herunterfahren" drücken.

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