La base de données en mémoire H2 stocke les données en mémoire dans la JVM. Lorsque la JVM se ferme, ces données sont perdues.
Je soupçonne que ce que vous faites est similaire aux deux classes Java ci-dessous. L'une de ces classes crée une table et l'autre essaie de s'y insérer:
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();
}
}
et
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();
}
}
Lorsque j'ai exécuté ces classes les unes après les autres, j'ai obtenu le résultat suivant:
C: \ Users \ Luke \ stuff> java CreateTable
C: \ Users \ Luke \ stuff> java InsertIntoTable
Exception dans le thread "main" org.h2.jdbc.JdbcSQLException: Table "PERSON" introuvable; Instruction SQL:
INSÉRER DANS LES VALEURS PERSONNE (ID, PRÉNOM, LASTNAME) (1, 'John', 'Doe') [42102-154]
à org.h2.message.DbException.getJdbcSQLException (DbException.java:327)
à org.h2.message.DbException.get (DbException.java:167)
à org.h2.message.DbException.get (DbException.java:144)
...
Dès que le premier java
processus se termine, la table créée par CreateTable
n'existe plus. Ainsi, lorsque la classe InsertIntoTable arrive, il n'y a pas de table dans laquelle l'insérer.
Lorsque j'ai changé les chaînes de connexion en jdbc:h2:test
, j'ai constaté qu'il n'y avait pas une telle erreur. J'ai également constaté qu'un fichier test.h2.db
était apparu. C'était là que H2 avait mis la table, et comme elle avait été stockée sur le disque, la table était toujours là pour que la classe InsertIntoTable la trouve.
Person
. H2 ne sait rien de la base de données que vous avez créée sur le disque auparavant.