База данных H2 в памяти хранит данные в памяти внутри JVM.Когда JVM завершает работу, эти данные теряются.
Я подозреваю, что то, что вы делаете, похоже на два приведенных ниже Java-класса.Один из этих классов создает таблицу, а другой пытается вставить в нее:
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();
}
}
и
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();
}
}
Когда я запускал эти классы один за другим, я получал следующий вывод:
C:\Users\Luke\stuff>java CreateTable
C:\Users\Luke\stuff>java InsertIntoTable
Exception in thread "main" org.h2.jdbc.JdbcSQLException: Table "PERSON" not found; SQL statement:
INSERT INTO PERSON (ID, FIRSTNAME, LASTNAME) VALUES (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)
...
Как только первый процесс java
завершается, таблица, созданная CreateTable
, больше не существует.Итак, когда появляется класс InsertIntoTable, для него нет таблицы для вставки.
Когда я изменил строки подключения на jdbc:h2:test
, я обнаружил, что такой ошибки не было.Я также обнаружил, что появился файл test.h2.db
.Это было то место, где H2 поместил таблицу, и, поскольку она была сохранена на диске, таблица все еще была там для класса InsertIntoTable, чтобы найти ее.