2012-12-07 31 views
0

我想在運行在Tomcat上的基於servlet的應用程序中嵌入一個Derby數據庫。servlet要寫入的可接受位置?

爲此,我需要將數據庫文件保存在磁盤上。我希望他們駐留在已部署的Web應用程序的子文件夾中(然後我可以使用getServletContext().getRealPath()進行轉換)。

是否有一個很好的做法WRT可以接受的,相對於應用程序的位置,其中一個servlet可以安全地寫?如果不存在這樣的建議,那麼tomcat特定的良好實踐是什麼?

This discussion似乎排除WebContent寫作;我將不得不寫一個CATALINA_HOME子文件夾,因爲一些教程指出(但它感覺hackish)?

+0

至於'getRealPath()'的事,這是不好的,因爲你沒有做任何更改將丟失時,你重新部署WAR甚至當你重新啓動其自動重新部署現有的WAR服務器。簡單的原因是這些更改根本不包含在原始WAR中。 – BalusC

回答

1

你需要讓文件系統的持久性位置明確的參數到您的程序,可能是一個屬性(即-DdataStoreLocation=somepath)。通常,Java應用程序可能有權訪問文件系統 - 它可以從WAR內運行,甚至可以從網絡加載並且沒有類路徑相關的文件系統。

讓它成爲您的應用程序與用戶合同的明確要求,部分是爲了保證有一個文件系統使用,一種方式來獲得的路徑名稱中使用的唯一途徑。

+0

好的,所以你的答案是「否」:沒有通用的文​​件系統位置Servlet可以寫入存在。所以我應該堅持一個數據源(如你所建議的那樣,在部署時報告位置/配置選擇),或者仍然能夠使用嵌入式數據庫,將它的文件系統位置作爲參數傳遞(我可以使用'server .xml'?JNDI?)。 – oparisy

+0

我看到一個[Context](http://stackoverflow.com/a/1626190/38096)可以做到這一點。 – oparisy

+0

可能沒有文件系統,但不太可能。 Context是Java應用程序可以與其環境交互的另一種方式,如果該環境是應用程序服務器。有一個系統屬性'java.io.tmpdir'用於臨時文件系統資源,但不能保證放置在那裏的東西將無限期地保存下來。由於您具體詢問servlet,所以Context是提供路徑信息的好地方。 –

1

當你安裝一個應用程序時,你寧願看到你的數據存儲在/usr/bin(或C:/Program Files)的某個地方,或者更確切地說你的主目錄中的其他數據在哪裏?

不耦合的應用程序二進制文件(這永遠不會改變),用它操作的數據。刪除應用程序時不希望丟失數據,反之亦然。用戶主目錄甚至更好 - 在安裝過程中選擇的文件夾 - 要好得多。

+0

如何在服務器部署的應用程序的上下文中定義「用戶主目錄」?我明白不寫入WebContent確實是由於重新部署導致刪除的風險。 – oparisy