Il database in memoria H2 memorizza i dati in memoria all'interno della JVM. All'uscita della JVM, questi dati vengono persi.
Sospetto che ciò che stai facendo sia simile alle due classi Java seguenti. Una di queste classi crea una tabella e l'altra tenta di inserirvi:
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();
}
}
e
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();
}
}
Quando ho eseguito queste classi una dopo l'altra, ho ottenuto il seguente output:
C: \ Users \ Luke \ stuff> java CreateTable
C: \ Users \ Luke \ stuff> java InsertIntoTable
Eccezione nel thread "main" org.h2.jdbc.JdbcSQLException: tabella "PERSON" non trovata; Istruzione SQL:
INSERIRE IN PERSONA (ID, FIRSTNAME, LASTNAME) VALORI (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)
...
Non appena java
termina il primo processo, la tabella creata da CreateTable
non esiste più. Quindi, quando arriva la classe InsertIntoTable, non c'è alcuna tabella in cui inserirla.
Quando ho cambiato le stringhe di connessione in jdbc:h2:test
, ho scoperto che non si verificava un errore del genere. Ho anche scoperto che test.h2.db
era apparso un file . Questo era il punto in cui H2 aveva inserito la tabella e poiché era stata archiviata su disco, la tabella era ancora lì per essere trovata dalla classe InsertIntoTable.
Person
nuovamente la tabella . H2 non sa nulla del database creato in precedenza sul disco.