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类查找。
Person
再次创建表。H2对您之前在磁盘上创建的数据库一无所知。