如何连接到只读可运行jar内的H2数据库文件?

时间:2018-03-18 20:52:54

标签: java javafx jar zip h2

我要求使用create / insert语句创建一次数据库,然后使用只读数据库访问权限将其设置为在javafx runnable jar 中。

我刚刚浏览了H2数据库文档并尝试使用H2 Driver version 1.4.196 and 1.4.192来实现这一点,但我想我错过了一些东西。

我可以连接而不将其包含在runnable jar中,只读内容也可以。但我需要从jar本身访问它以防止外部人员访问数据库。

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

当然,我需要thisthisthis.

更明确的实际例子

我已经将压缩逻辑实现为this,并且它在给定路径下工作正常。

但是当我在runnable 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文件中访问它。

1 个答案:

答案 0 :(得分:0)

认为我们无法直接从可运行的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");

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