# hsqldb - Database must be shutdown



## Heady86 (21. Sep 2009)

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:


```
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


----------



## L-ectron-X (23. Sep 2009)

Die Exception wird von HSQL selbst geworfen. Hast du zwei verschiedene DB-Versionen im Speicher aktiv?


----------



## Heady86 (23. Sep 2009)

> 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:


----------



## DerEisteeTrinker (26. Sep 2009)

dann denkt die datenbank immernoch, dass sie offen ist. du solltest wenn du die connection nicht mehr brauchst auch die verbindung richtig kappen.


----------



## Heady86 (28. Sep 2009)

Ist das hier nicht der Fall? ???:L


```
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();
        }
    }
}
```


----------



## DerEisteeTrinker (28. Sep 2009)

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:

```
try {
	if (connection != null) {
		connection.close();
	}
} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
```

Dein Progrämmchen:


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


----------



## Heady86 (28. Sep 2009)

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


----------



## maki (28. Sep 2009)

Nimm die 1.8, 1.9 ist erst im Release Candidate Stadium, also noch Beta.


----------



## DerEisteeTrinker (28. Sep 2009)

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


----------



## Heady86 (29. Sep 2009)

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


----------



## javadan (30. Apr 2012)

oben wurde schon alles richtig gemacht. der Befehl 
	
	
	
	





```
connection.close
```
 kann nicht alle Arten von DB Verbindungen trennen. Die HSQLDB braucht ein Query mit dem Befehl "Shutdown" damit die Verbindung getrennt wird.


----------

