2017-01-25 33 views
0

我已經開發了一個使用Spring Boot的小應用程序,該應用程序暫時使用HSQLDB作爲數據庫來存儲用戶。我想要做的是將數據庫存儲在Maven的資源文件夾中。我application.properties文件包含以下配置:WAR中的資源中的HSQLDB

#... 
spring.datasource.url=jdbc:hsqldb:file:src/main/resources/database/dashboard 
#... 

所以,當我開始使用Java應用程序(右鍵點擊我的應用程序的main()和運行方式春季啓動應用程序),數據庫存儲的權利。

但是,在將WAR文件打包爲mvn clean install spring-boot:repackage後,將其部署到Tomcat(例如並運行它)後,數據庫不存儲在爆炸WAR中。

我的問題是我怎麼能告訴spring.datasource.url=jdbc:hsqldb:file:*屬性來存儲Maven資源目錄中的數據庫(它將在爆炸WAR後仍然指向)?我可以使用pom.xml中使用的某種環境變量嗎?

編輯 鑑於@Steve C和@fredt的答案,我意識到數據庫不應該存儲在戰爭中。相反,我會將其存儲在用戶的主目錄spring.datasource.url=jdbc:hsqldb:file:~/tomcat_webapp_data/dashboard/database ..非常感謝!

+1

您似乎正在使用相對路徑指向hsqldb。 Hsql的文件位置將相對於工作目錄(可能是bin/in tomcat /)。你應該使用絕對路徑。 – Redlab

+1

1)更好的使用Apache Derby,HSQLDB總是被完全加載到RAM內存中 - 這可能會讓你的應用程序更大的DB 2)只是改變構建腳本包括整個db目錄iinto war,然後一定要有正確的路徑db在服務器容器中的文件 –

+0

@Redlab我不想使用絕對路徑,因爲我不知道將要放置WAR的系統的性質(linux,win ...)以及它是否會運行與java。 – russellhoff

回答

2

WAR文件的目錄和內容是隻讀的。

可以包括戰前設置HSQLDB數據庫屬性文件的READ_ONLY標誌。您使用jdbc:hsqldb:res:<path>網址訪問這類數據庫。

如果要將數據存儲在持久性和可更新數據庫中,請連接到應用程序中的(第一個不存在的)數據庫,並設置其表格,如果它們尚不存在來自資源的數據。然後你可以存儲數據。數據庫路徑應位於用於JAR和資源的目錄之外。

相反的意見中的一個,HSQLDB不限於在存儲器中存儲數據,並且可以具有基於磁盤的表,稱爲CACHED表。

您可以在數據庫中包括URL的變量拿起從Web服務器預先定義的屬性。例如:

jdbc:hsqldb:file:${mydbpath} 

http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html#dpc_variables_url

1

Maven的src/main/resources目錄是構建時間路徑,而不是運行時路徑。

如果你正在構建一個jar文件,然後在src/main/resources一切都被複制到罐子的根源。

如果你正在構建一個war文件,然後在src/main/resources一切都被複制到/ WEB-INF/classes中戰爭的根目錄下。現在

,你的JDBC URL jdbc:hsqldb:file:src/main/resources/database/dashboard被指示使用相對路徑的文件。在運行時,這個路徑是相對於當前工作目錄的 - 並且它在運行時不太可能存在。

如果你真的想建立你的戰爭中的數據庫,然後給出:

  • 要部署的分解WAR文件(這是不可能寫出WAR文件本身的內容);

  • 你真的很想將數據庫存儲在爆炸WAR中;

  • 你想把它放在WEB-INF/database/dashboard(如果你存儲在WEB-INF目錄之外,有安全隱患);

那麼你可以使用類似計算JDBC網址:

... 
String databaseDirectoryName = servletContext.getRealPath("WEB-INF/database"); 
File databaseDirectory = new File(databaseDirectoryName); 
if (!databaseDirectory.exists()) { 
    if (!databaseDirectory.mkdirs()) { 
     throw new RuntimeException("Failed to create database directory"); 
    } 
} 
File databaseFile = new File(databaseDirectory, "dashboard"); 
String jdbcURL = "jdbc:hsqldb:" + databaseFile.toURI(); 
... 

獲得該到你的Spring配置是你的一個鍛鍊;但使用@Configuration@Bean作爲實現此目的的一種方法 - 您只需在Spring配置時訪問servletContext即可。

相關問題