【问题标题】:How can I connect to read only H2 database file which is inside runnable jar?如何连接到可运行 jar 中的只读 H2 数据库文件?
【发布时间】:2018-08-27 09:46:48
【问题描述】:

我需要使用 create/insert 语句创建一次数据库,然后通过 只读 数据库访问权限使其在 javafx 可运行 jar 内可用。

我刚刚多次浏览 H2 数据库文档并尝试使用 H2 Driver version 1.4.196 and 1.4.192 来实现这一点,但我认为我遗漏了一些东西。

我可以在不将其包含在可运行 jar 中的情况下进行连接,并且只读的东西也可以。但我需要从 jar 本身访问它,以防止外人访问数据库。

我可以有连接字符串或逻辑来连接来自 jar 本身的只读 DB 文件吗?

当然,我需要来自thisthisthis. 的更清晰的实际示例

我已将压缩逻辑实现为this,它在给定路径上运行良好。

但是当我在可运行的 jar 中添加 zip 文件并通过以下代码访问它时:

DriverManager.getConnection("jdbc:h2:file:split:zip:./test.zip!/test");

然后它抛出异常:

Exception in thread "main" org.h2.jdbc.JdbcSQLException: IO Exception: "java.io.FileNotFoundException: .\jar\res\buzdirectory.zip (The system cannot find the path specified)"; "listFiles zip:./jar/res/buzdirectory.zip!/" [90031-196]

如果我输入完全限定的路径,那么它运行良好:

DriverManager.getConnection("jdbc:h2:file:split:zip:C:\\CoreJava\\src\\main\\java\\res\\test.zip!/test");

我在这里缺少从 jar 文件访问它的内容。

【问题讨论】:

  • ZIP 文件存储在哪里?看起来您正在引用一个不存在的文件
  • 实际上 zip 文件路径是完美的并且存在,但我认为我搞砸了文件创建。我可以有创建相同的步骤吗?
  • 压缩文件包含数据库?好像你把马放在车前(但我可能误解了你在做什么)。显然,您需要创建数据库,在压缩之前填充它的数据
  • 是的,它包含由 netbeans 连接服务创建的名为 test.mv.db 的数据库文件,并在 7z 压缩之前运行了 create/insert 语句。
  • 嗯,H2 支持 7z 吗?您是否尝试过更传统的 ZIP 归档器甚至 jar(仅使用 ZIP)?

标签: java javafx jar zip h2


【解决方案1】:

认为我们不能直接从可运行的 JAR 文件打开数据库文件。要访问它应该是一个“真实”文件,因此我们需要从 JAR 中提取它,然后打开该副本。

例如,要将 JAR 中的数据库提取到临时文件中:

File dbFile = File.createTempFile("temp", ".zip");
dbFile.deleteOnExit();

java.nio.file.Files.copy(this.getClass().getResourceAsStream("/db/temp.zip"), 
        dbFile.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);

StringBuffer connStr = new StringBuffer("jdbc:h2:file:split:zip:")
        .append(dbFile.getAbsolutePath()).append("!/temp");

Connection conn = DriverManager.getConnection(connStr.toString());
conn.close();
System.out.println("closed");

顺便说一句,这并不是最好的方法。但是我们可以在一些特殊情况下使用这种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多