H2 Locked by another process

Enigma228

Bekanntes Mitglied
Hi Leute
ich habe hier recht viel gutes über H2 gehört und wollte es mal nutzen..
Sinn der Sache ist es, das ich nicht extra eine Datenbank installieren muss, wenn ich das Programm an einen Freund weitergeben möchte. Also wollte ich sie "embedded" nutzen.

Dafür bin ich folgende Schritte durch:
1. Jar file runtergeladen
2. neues Projekt mit Eclipse -> neues Lib erstellt und jar file in dieses Lib eingebunden
3. dann das übliche Gui und so weiter
4. eine Datenbankklasse erstellt
Java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;


public class DB_Connect {

	public DB_Connect() {
		try {
			Class.forName("org.h2.Driver");
			Connection conn = DriverManager.getConnection("jdbc:h2:~/test", "root", "meinpasswort");
			Statement stmt = conn.createStatement();
			String order = "TEST DROP TABLE IF EXISTS TEST; CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255));";
			ResultSet rs = stmt.executeQuery(order);
			while(rs.next()){
				//System.out.println(rs.getInt(0)+" : "+rs.getString(1));
			}
	        conn.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
nur zum testen..
Was mache ich verkehrt?

beim Ausführen kommt folgender Fehler:
org.h2.jdbc.JdbcSQLException: Datenbank wird wahrscheinlich bereits benutzt: "Locked by another process". Mögliche Lösungen: alle Verbindungen schliessen; Server Modus verwenden
Database may be already in use: "Locked by another process". Possible solutions: close all other connection(s); use the server mode [90020-152]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:327)
at org.h2.message.DbException.get(DbException.java:167)
at org.h2.message.DbException.get(DbException.java:144)
at org.h2.store.FileLock.getExceptionAlreadyInUse(FileLock.java:443)
at org.h2.store.FileLock.lockFile(FileLock.java:338)
at org.h2.store.FileLock.lock(FileLock.java:134)
at org.h2.engine.Database.open(Database.java:535)
at org.h2.engine.Database.openDatabase(Database.java:218)
at org.h2.engine.Database.<init>(Database.java:213)
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.<init>(JdbcConnection.java:114)
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:98)
at org.h2.Driver.connect(Driver.java:72)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at DB_Connect.<init>(DB_Connect.java:12)
at MyFrame.<init>(MyFrame.java:21)
at Main$1.run(Main.java:16)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
 
Zuletzt bearbeitet von einem Moderator:

thE_29

Top Contributor
Probier mal den Rechner rebooten!

Das wichtigste ist, dass die Verbindung immer sauber geschlossen wird!

Also dein con.close() gehört in einen finally Block!
 

Enigma228

Bekanntes Mitglied
Fehler Nr 1. habe ich herausgefunden..
Habe aus Verzweiflung nicht nur die Jar downgeloadet, sondern auch die Installerversion für Windows (und installiert)..
damit habe ich die H2 Console geöffnet und schon war die Datenbank für mein Programm blockiert..

Jetzt führt er zwar die Anweisung im Javaprogramm aus(Console habe ich geschlossen).. aber ist meine DB noch embedded oder arbeite ich mit der installierten version??
Denn wenn ich den Client aufrufe (über die installierte Version) sehe ich meine Tabelle..

Habe derzeit keinen 2. Rechner bei dem ich sowas testen könnte..

Java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;


public class DB_Connect {

	Connection conn;
	public DB_Connect() {
		try {
			Class.forName("org.h2.Driver");
			conn = DriverManager.getConnection("jdbc:h2:~/test", "root", "meinpasswort");
			Statement stmt = conn.createStatement();
			String order = "DROP TABLE IF EXISTS TEST; CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255));";
			stmt.execute(order);
			//conn.close();
	    } catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
    }
}
 
Zuletzt bearbeitet:

Enigma228

Bekanntes Mitglied
Danke

bedeutet also:
Java:
conn = DriverManager.getConnection("jdbc:h2:~/test", "root", "meinpasswort");
das "~/test" das ich embedded bin?
und das die DB also "test" heisst und ich sie aber auch "meintest" nennen könnte??

Nachtrag: habs schon rausgefunden.. grins
Es geht doch nichts über probieren..
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben