h2(嵌入式模式)数据库文件问题

2022-09-03 13:58:14

在我的src目录(Java,Eclipse)中有一个h2数据库文件:h2test.db

问题:

  • 从命令行(以及端口8082上的h2浏览器界面)开始h2.jar,我在h2test中创建了2个表,“test1”和“test2.db并在其中放置了一些数据;

  • 当尝试从java代码(JDBC)访问它们时,它会给我“表未找到异常”。Java 代码中的“show tables”显示了一个包含 0 行的结果集。

  • 此外,当从java代码创建新表(“newtest”)时(CREATE TABLE ...等),之后启动h2.jar浏览器界面时,我看不到它;只显示了另外两个表('test1'和'test2')(但是可以从java代码访问新创建的表'newtest')。

我对嵌入式数据库没有经验;我相信我在这里做一些根本性的错误。我的假设是,我正在访问同一个文件 - 一次来自java应用程序,一次来自h2控制台浏览器界面。我似乎无法理解它,我在这里做错了什么?

编辑:根据要求,添加一些代码:

Java 代码:

Class.forName("org.h2.Driver");
String url = "jdbc:h2:" + "db/h2test.db";
String user = "aeter"; 
String password = "aeter"; 
Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement ps2 = conn.prepareStatement("Show tables;");
ResultSet rs = ps2.executeQuery();

此结果集有 0 行(无表),而不是向我显示 2 个表。

H2 控制台浏览器界面设置:

Settings: Generic h2(embedded)
driver class: org.h2.Driver
JDBC URL: jdbc:h2:../../workspace/project_name/src/db/h2test.db
user name: aeter
password: aeter 

编辑2:我将数据库复制到新文件夹。现在,新文件夹中的 db 文件与 'newtest' 表(来自 java 代码)和 'test1' 和 'test2' 表(从控制台浏览器 h2 界面)一起显示 - 与旧 db 文件的显示方式完全相同。因此,db 文件的副本仍然存在问题。


答案 1

对于嵌入模式,您需要检查路径。例如,使用相对于主目录的路径:

"jdbc:h2:file:~/db/h2test.db"

要确定,请使用完整路径:

"jdbc:h2:file:/users/aeter/db/h2test.db"

为方便起见,请追加以避免创建虚假的数据库文件。;IFEXISTS=TRUE

有关详细信息,请参阅使用 JDBC 连接到数据库

H2 服务器 URL 相对于指定为 的参数。-baseDirmain()


答案 2

此外,如果您在 JDBC url 中使用一些特殊参数,则可能存在问题,数据库文件名可能因各种情况而异。

在我的情况下,我有两个URL:

  • jdbc:h2:~/XXX;MVCC=FALSE;MV_STORE=假
  • jdbc:h2:~/XXX

第一种情况创建了XXX.h2.db文件,第二种情况是XXX.mv.db,请注意。


推荐