2009-11-24 73 views
11

我應該在哪裏將持久性文件存儲在Tomcat Web應用程序中?何處/如何使用tomcat存儲持久數據?

  • javax.servlet.context.tempdir是不可行的,當應用程序重新部署它的擦除/刪除
  • 不想使用例如絕對路徑servlet初始化參數
  • 在數據庫中存儲的文件是不是一種選擇
+2

我認爲你不想使用數據庫? – Suppressingfire 2009-11-24 20:15:43

+2

你必須解釋爲什麼數據庫不是一種選擇,它們是如此基本和普遍,以至於不允許它意味着其他事情正在發生。也許你是在一個我們應該知道的特殊約束環境中。 – Karl 2009-11-24 20:46:59

+2

這不是一種選擇,因爲它不是。我可以繼續講解如何通過對數據庫一無所知的傳統外部工具來處理這些大型文件,並將它們顯示在數據庫中,目的只是爲了將它們再次拉出來,目前沒有任何用處。還有更多,但只要我的話:-) - – nos 2009-11-24 23:06:38

回答

9

我們的團隊做了很多。我們遵循的一般規則是在Web應用程序之外和Tomcat之外。

我們的系統管理員在我們的服務器上建立了一個tomcat用戶擁有rw權限的目錄(例如/var/tomcat/persist)。我們已經建立了一個目錄結構,tomcat使用它來存儲文件,讀取特定於應用程序的init文件等。

如果您不想在您的servlet的init-params中使用絕對路徑,請考慮當tomcat啓動時設置一個系統屬性。關於這一點的好處是每個在tomcat下運行的應用程序都可以訪問它。壞處在於,每個在tomcat下運行的應用程序都可以訪問它。您可以設置一個名爲base.persist.dir的屬性併爲其下的每個應用程序構建子目錄。我們在CATALINA_OPTS環境變量下的bin/目錄中設置setenv.sh腳本中的系統屬性。

5

回答問題的標題,有關使用一個數據庫,一個DataSource和JDNI什麼?即使在僅限Web的環境中,由於併發性,線程,安全性,集羣,可移植性等問題,也不推薦使用java.io寫入文件。其中一些問題可能是「解決方法」,但仍然不是最佳做法。標準的方法是使用數據庫,我建議重新考慮這個選項,將「基於文件」的輕量級數據庫(如HSQLBD或JavaDB)引入混合。

(編輯:對於一個未知的原因,數據庫是不是一種選擇使用JNDI或上下文參數或初始化參數傳遞一個絕對路徑 - 這是不太糟糕的選擇恕我直言 - 被排除在外太對於相對。路徑,也許看看user.homeuser.dir然後 - 或者你可以通過命令行傳遞的任何其他系統屬性。我不喜歡它,我不會這樣做,並且這不能解決前面提到的問題,但它畢竟是你的選擇。)

+0

克萊德。數據庫不是一個選項。 – nos 2009-11-24 20:28:20

0

我通常會建議使用數據庫來存儲持久數據並通過DataSource公開它。

如果你不想這樣做,我想你可以考慮使用「user.home」系統屬性(我已經看到這在少數情況下使用)。但是......沒有保證你的servlet將被授權運行,除非你自己配置。

4

將文件存儲在運行Tomcat的用戶的主目錄下的webapp目錄中是一個不錯的方便選項。它在Tomcat之外,這意味着它將在重新部署之後生存下來,它通常是一個可寫的目錄(因爲它是在用戶的主目錄下創建的)。 但允許通過系統屬性覆蓋此目錄的位置總是一個好主意。

1

通常,這將轉到數據庫。但由於OP堅持不使用數據庫,我會嘗試一種不同的方法:

  • 已知的文件系統路徑:${user.home}/.myapp。應用程序有時將其用於例如搜索可以根據數據庫中的數據重新計算的索引。用戶的家可能會使用用例。
  • 將可配置文件系統路徑存儲在配置庫(如數據庫)中,或者可能是Java首選項(如果您不喜歡使用servlet init params)。商業應用程序(如Atlassian JIRA)使用可配置(但絕對)的文件系統路徑來存儲問題附件。如果他們不知道更好的辦法,我不知道是誰:)
+0

在tomcat7上(至少在Ubuntu上)寫入$ {user.home}會因爲權限而導致IOException。 – Jonathan 2016-12-22 19:21:58

相關問題