[英]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.