Die speicherinterne H2-Datenbank speichert Daten im Speicher innerhalb der JVM. Beim Beenden der JVM gehen diese Daten verloren.
Ich vermute, dass das, was Sie tun, den beiden folgenden Java-Klassen ähnlich ist. Eine dieser Klassen erstellt eine Tabelle und die andere versucht, sie einzufügen:
import java.sql.*;
public class CreateTable {
public static void main(String[] args) throws Exception {
DriverManager.registerDriver(new org.h2.Driver());
Connection c = DriverManager.getConnection("jdbc:h2:mem:test");
PreparedStatement stmt = c.prepareStatement("CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64))");
stmt.execute();
stmt.close();
c.close();
}
}
und
import java.sql.*;
public class InsertIntoTable {
public static void main(String[] args) throws Exception {
DriverManager.registerDriver(new org.h2.Driver());
Connection c = DriverManager.getConnection("jdbc:h2:mem:test");
PreparedStatement stmt = c.prepareStatement("INSERT INTO PERSON (ID, FIRSTNAME, LASTNAME) VALUES (1, 'John', 'Doe')");
stmt.execute();
stmt.close();
c.close();
}
}
Wenn ich diese Klassen nacheinander durchführte, erhielt ich die folgende Ausgabe:
C: \ Benutzer \ Luke \ stuff> java CreateTable
C: \ Users \ Luke \ stuff> Java InsertIntoTable
Ausnahme im Thread "main" org.h2.jdbc.JdbcSQLException: Tabelle "PERSON" nicht gefunden; SQL-Anweisung:
INSERT IN PERSON (ID, FIRSTNAME, LASTNAME) -WERTE (1, 'John', 'Doe') [42102-154]
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)
...
Sobald der erste java
Prozess beendet wird, existiert die von erstellte Tabelle CreateTable
nicht mehr. Wenn also die InsertIntoTable-Klasse hinzukommt, gibt es keine Tabelle, in die sie eingefügt werden kann.
Als ich die Verbindungszeichenfolgen in änderte, jdbc:h2:test
stellte ich fest, dass es keinen solchen Fehler gab. Ich fand auch, dass eine Datei test.h2.db
erschienen war. Hier hatte H2 die Tabelle abgelegt, und da sie auf der Festplatte gespeichert war, war die Tabelle immer noch für die InsertIntoTable-Klasse verfügbar.
Person
erneut erstellen . H2 weiß nichts über die Datenbank, die Sie zuvor auf der Festplatte erstellt haben.