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
线程“主”org.h2.jdbc.JdbcSQLException 中的异常:未找到表“PERSON”; SQL 语句:
插入人(ID、名字、姓氏)值(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)
...
一旦第一个java 进程退出,CreateTable 创建的表就不再存在。所以,当 InsertIntoTable 类出现时,没有表可以插入。
当我把连接字符串改成jdbc:h2:test时,发现没有这个错误。我还发现出现了一个文件test.h2.db。这是 H2 放置表格的位置,并且由于它已存储在磁盘上,因此 InsertIntoTable 类可以找到该表格。