hsqldb - Database must be shutdown

Status
Nicht offen für weitere Antworten.

Heady86

Bekanntes Mitglied
HI,

hab versucht auf eine .odb Datenbank zuzugreifen. Da es beim ersten Mal nicht funktioniert hab, habe ich mal eine neue hsqldb.lib eingebunden. Wenn ich jetzt aber versuche das Programm nochmal zu starten (hab es sogar mit einem neuen Programm versucht) kommt folgende Fehlermeldung:

Code:
java.sql.SQLException: old version database must be shutdown
	at org.hsqldb.jdbc.Util.sqlException(Util.java:363)
	at org.hsqldb.jdbc.Util.sqlException(Util.java:103)
	at org.hsqldb.jdbc.JDBCConnection.<init>(JDBCConnection.java:3233)
	at org.hsqldb.jdbc.JDBCDriver.getConnection(JDBCDriver.java:285)
	at org.hsqldb.jdbc.JDBCDriver.connect(JDBCDriver.java:245)
	at java.sql.DriverManager.getConnection(DriverManager.java:582)
	at java.sql.DriverManager.getConnection(DriverManager.java:185)
	at DBTest.connect(DBTest.java:19)
	at DBTest.main(DBTest.java:56)
Caused by: org.hsqldb.HsqlException: old version database must be shutdown
	at org.hsqldb.error.Error.error(Error.java:112)
	at org.hsqldb.error.Error.error(Error.java:82)
	at org.hsqldb.persist.HsqlDatabaseProperties.load(HsqlDatabaseProperties.java:446)
	at org.hsqldb.persist.Logger.openPersistence(Logger.java:191)
	at org.hsqldb.Database.reopen(Database.java:265)
	at org.hsqldb.Database.open(Database.java:237)
	at org.hsqldb.DatabaseManager.getDatabase(DatabaseManager.java:225)
	at org.hsqldb.DatabaseManager.newSession(DatabaseManager.java:148)
	at org.hsqldb.jdbc.JDBCConnection.<init>(JDBCConnection.java:3216)
	... 6 more

Krieg ich die manuell geschlossen oder so? Hab auch mal eclipse neugestartet und logs gelöscht, gleiches Problem

/edit: google findet zu "old version database must be shutdown" nur ein Suchergebnis und das ist die Datei wo halt die Error meldungen hinterlegt sind :bahnhof:


Danke, Grüße
 
Zuletzt bearbeitet:
Die Exception wird von HSQL selbst geworfen. Hast du zwei verschiedene DB-Versionen im Speicher aktiv?

Nicht dass ich wüsste. Zwischendurch wurde der Rechner ja auch immer mal wieder neugestartet und war über Nacht auch aus, also ist es leider doch kein Problem das sich von selber behebt bzw. nur was mit dem Speicher zu tun hatte. Hab nämlich auch schon gedacht dass die halt im Hintergrund irgendwie noch offen ist, aber dann müsste sie ja spätestens nach dem Ausschalten vom PC funktionieren :noe:
 
dann denkt die datenbank immernoch, dass sie offen ist. du solltest wenn du die connection nicht mehr brauchst auch die verbindung richtig kappen.
 
Ist das hier nicht der Fall? ???:L

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

public class DBTest {

    private Connection connection;

    public void connect() throws SQLException {
        try {
            Class.forName("org.hsqldb.jdbcDriver");
        } catch (final ClassNotFoundException exception) {
            System.out.println("HSQLSB driver not found");
            System.exit(-1);
        }
        connection = DriverManager.getConnection("jdbc:hsqldb:file:E:/test/database/", "sa", "");
        
    }

  
    public void disconnect() {
    	try {
			connection.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    
    public void executeQuery(final String query) throws SQLException {
        final Statement stmt = connection.createStatement();
                              
        stmt.close();
    }

  
    public static void main(final String[] args) {
        final DBTest test = new DBTest();
        try {

            test.connect();
            test.executeQuery("SELECT * FROM Person");
            test.disconnect();
            
        } catch (final SQLException exception) {
            exception.printStackTrace();
        }
    }
}
 
dein Quelltext hat die Schwachstelle, dass die Verbindung offen bleibt, wenn es bei dem Statement einen Fehler gibt. Ich würde das wie folgt machen

Die disconnect-Methode:
Java:
try {
	if (connection != null) {
		connection.close();
	}
} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Dein Progrämmchen:

Java:
try {
	 
    test.connect();
    test.executeQuery("SELECT * FROM Person");
    
} catch (final SQLException exception) {
    exception.printStackTrace();
} finally {
	test.disconnect();
}
 
Hi,

danke, hab das jetzt so angepasst, allerdings bleibt der Fehler der selbe.

Kann es auch irgendwie an der lib liegen? Ich hab die hier für den build path verwendet

Danke und Grüße
 
Nimm die 1.8, 1.9 ist erst im Release Candidate Stadium, also noch Beta.
 
wenn der fehler auch nach der neuen lib noch da ist, musst du die datenbank neu anlegen. weil du sie dir dann höchstwahrscheinlich zerschossen hast
 
Morgen,

also hab jetzt die die ältere 1.8 lib wieder reingemacht und die Datenbank neu erstellt.

Der Fehler ist jetzt weg allerdings kommt beim ausführen "terminated", hab dann im debug gesehen dass folgende Meldung kommt:

ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [../../../src/share/back/util.c:820]

Google sagt bei mehreren Treffern dass es sich um einen Java Bug handelt der immer noch nicht geregelt ist, stimmt das? Workarounds wie System.exit(0) oder eine kleine Sleeptime haben nicht gewirkt :rtfm:

Jemand noch eine Idee? Gibts ja wohl nicht dass so ein billiges Programm so rumzickt 😛ueh:

Danke und Grüße

/edit: Java 6 und Eclipse 3.4.1
 
Zuletzt bearbeitet:
oben wurde schon alles richtig gemacht. der Befehl
Java:
connection.close
kann nicht alle Arten von DB Verbindungen trennen. Die HSQLDB braucht ein Query mit dem Befehl "Shutdown" damit die Verbindung getrennt wird.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben