内存中的H2数据库
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 类中找到。