簡體   English   中英

如何連接到可運行jar中的只讀H2數據庫文件?

[英]How can I connect to read only H2 database file which is inside runnable jar?

我需要使用create / insert語句創建一次數據庫,然后使其具有只讀 DB訪問權限的javafx可運行jar內可用。

我剛剛瀏覽了H2數據庫文檔很多次,並嘗試使用H2 Driver version 1.4.196 and 1.4.192實現此H2 Driver version 1.4.196 and 1.4.192但是我想我缺少了一些東西。

我可以連接而不必將其包含到可運行的jar中,並且只讀取正常工作的內容。 但是我需要從jar本身訪問它,以防止外部人訪問數據庫。

我可以使用連接字符串或邏輯來連接jar本身的只讀DB文件嗎?

Ofcourse我需要更加明確實際的例子這個這個這個。

我實現荏苒邏輯和它的作品從給定的路徑罰款。

但是,當我在可運行的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文件訪問它的東西。

認為我們不能直接從可運行的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");

順便說一句,這不是所有方法都是可取的。 但是我們可以在某些特殊情況下使用這種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM