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?

7voto

Jackkobec Punkte 4677

Sie können auch die Datei der h2-Dateiendatenbank löschen und das Problem wird verschwinden.

jdbc:h2:~/dbname bedeutet, dass die Datei der h2-Datenbank mit dem Namen db-Name im Benutzerverzeichnis erstellt wird (~/ bedeutet Benutzerverzeichnis, ich hoffe, Sie arbeiten mit Linux).

Auf meiner lokalen Maschine befindet es sich in: /home/jack/dbname.mv.db Ich weiß nicht, warum die Datei den Namen dbname.mv.db statt dbname hat. Vielleicht sind es die Standard-Einstellungen von h2. Ich entferne diese Datei:

rm ~/dbname.mv.db

ODER:

cd ~/
rm dbname.mv.db

Die Datenbank dbname wird mit allen Daten entfernt. Nach der Initialisierung der neuen Datenbank wird alles in Ordnung sein.

7voto

Sivakrishna Punkte 71

Einfacher Schritt: Gehen Sie zum Task-Manager und beenden Sie den Java-Prozess

dann starten Sie Ihre Anwendung

3voto

Tuhin Chandra Punkte 31

Wenn Sie dieselbe App in mehreren Ports ausführen, in der die App eine einzelne Datenbank (h2) verwendet, fügen Sie einfach AUTO_SERVER=TRUE in der URL wie folgt hinzu:

jdbc:h2:file:C:/simple-commerce/price;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE;AUTO_SERVER=TRUE

2voto

user6627139 Punkte 408

Ich bin bei ähnlichen Problemen gestoßen, als ich mit ORMLite aus einer Web-Anwendung lief. Zuerst war ich bei der Syntax für den Servermode in der URL stecken geblieben. Die oben genannten Antworten haben mir dabei geholfen. Dann hatte ich den ähnlichen Benutzer-/Passwortfehler, den ich leichter lösen konnte. Ich musste nichts herunterfahren oder Dateien löschen. Der folgende Code hat funktioniert:

protected ConnectionSource getConnectionSource() throws SQLException {
    String databaseUrl = "jdbc:h2:tcp://localhost/~/test";
    return new JdbcConnectionSource(databaseUrl,"sa","sa");
}

Um H2 im Servermodus auf Wildfly zu verwenden, habe ich die connection-url in der standalone.xml geändert

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

1voto

DerfOh Punkte 61

Ich bin auf ein ähnliches Problem gestoßen, die Lösung für mich bestand darin, fuser -k 'filename.db' auf die Datei auszuführen, die eine Sperre hatte.

Hoffe das hilft!

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