web-dev-qa-db-ja.com

Webアプリの一時データを保存するためのベストプラクティス

私の最新のプロジェクトでは、データベースからの情報を使用してドキュメントを生成できます。

そこで、オンデマンドでドキュメントテンプレートをユーザーの一時フォルダーにコピーして変更します。これは、変更時にすべてのテンプレートを使用できる必要があるためです。

その後、ユーザーは私のウェブアプリからのダウンロードリンクを介してドキュメントを受け取ります。

私の質問:webappデータを保存するためのベストプラクティスはありますか? tempがいいと思いました。しかし、私は自分でデータを削除する必要があるので、Tomcat webappフォルダー内のWARフォルダーの横に配置することを考えました。

Windows 2003をTomcatのホストシステムとして使用しています。私はプロジェクトでGrailsを使用していますJavaとMaven ...この情報が必要かどうかわかりません。

編集:
この些細な質問をする主な理由は...一時データの作成/削除を担当する場合...システムで一時フォルダを使用することはまだ良い方法ですか?これについてはよくわかりません...

28
bastianneu

(機密)ユーザー固有のファイルをwebappに保存する場合は、_/WEB-INF_のどこかに保存し、Servletを使用してそれらにアクセスします。これにより、(間接的に)ログインしたユーザーがチェックされます。ワールドワイドウェブ上のユーザー/ハッカー。利点は、ServletContext#getResource()または#getRealPath()を使用してプログラムから簡単にアクセスできることです。欠点は、webappを再デプロイするたびに失われることです。

デフォルトの一時フォルダに保存することもできます。利点は、File#createTempFile()またはSystem.getProperty("Java.io.tmpdir")などの標準APIからアクセスできることです。一時フォルダーには、OSで制御されるフォルダーのクリーンアップをJavaから制御できないという欠点があるため、リソースを閉じても後で必要になったときにデータが失われる危険性があります。

また、webapp以外の固定フォルダーに保存することもできます。これには、webappを再デプロイするたびに内容が失われないという利点があります。欠点は、十分なOS権限を持つフォルダーを自分で作成する必要があることです。これは、サードパーティのホストには適用できない場合があります。

自分の一時的なリソースをクリーニングすることは、確かに自分で行う必要があるタスクに属します。私はそれを懸念事項とは考えていません。

長所/短所を上回るだけです。

34
BalusC
  • Webアプリケーションフォルダー内に情報を保存する常に機能するわけではありません。一部のアプリケーションサーバーは、デプロイされたWARファイルを展開しないため、Webアプリケーション用の「作業ディレクトリ」はありません。一部のシステム管理者は、Webアプリケーションのファイルシステムへのアクセスを阻止します(これは、セキュリティマネージャーのポリシーに依存します)。
  • 一時ファイルは一時データに使用する必要があります。オンデマンドで再構築できるデータ。ユーザーがダウンロードすべき一時ファイルを使用しないでください。例えば。一時ファイルをクリーンアップする必要があるとシステムが判断した場合、またはアプリケーションサーバーを再起動した場合、ユーザーはこのファイルをダウンロードする必要がありますが、その間に削除される可能性があります。
  • このようなデータを保存する適切な場所はデータベースです。一時ファイルという意味では、ドキュメントは一時的なものではありません。データベースを使用してドキュメントを保存し、データベースをドキュメントのキャッシュとして使用します。その後、独自のクリーンアップ戦略を実装できます。また、永続的なストレージとしても機能するため、サーバーの再起動を心配する必要はありません。また、最終アクセス時刻やアクセスカウンターなどのメタデータを追加して、ユーザーが作成したドキュメントのリストを簡単にユーザーに提供できます。ドキュメント処理ライブラリが操作にJava.io.Fileを必要とする場合は、データベースからドキュメントを一時ファイルに保存し、処理を開始して、データベースに再度読み込みます。
13
mhaller

Webコンテナは、一時ディレクトリを指すコンテキスト属性を提供します。

サーブレット仕様SRV.3.7.1一時作業ディレクトリ

サーブレットコンテキストごとに一時ストレージディレクトリが必要です。サーブレットコンテナは、サーブレットコンテキストごとにプライベート一時ディレクトリを提供し、 ServletContext.TEMPDIRjavax.servlet.context.tempdir)コンテキスト属性。属性に関連付けられたオブジェクトは、Java.io.Fileタイプである必要があります。

例:

File appTempDir = getServletContext().getAttribute(ServletContext.TEMPDIR);
File tempFile = File.createTempFile("process1", ".txt", appTempDir);
tempFile.deleteOnExit();
try {
    ...
} finally {
    tempFile.delete();
}
7
weberjn

一時ファイルは一時フォルダーにあると思います。あなたの場合、自分でファイルを削除しますが、ファイル削除操作にバグがある場合はどうなりますか?または、ファイルが削除される前にサーバーがシャットダウンした場合はどうなりますか?一時フォルダーに書き込む場合、少なくともファイルが後で(手動でまたは何らかのプロセスによって)クリーンアップされることが期待されます。

アプリケーションが永続的なデータ(つまり一時的ではない)を格納したい場合でも、Tomcatディレクトリに格納しないでください。これらのディレクトリは、アプリケーションの新しいバージョンをデプロイするたびに削除または上書きされる傾向があるためです(またはTomcatの新しいバージョンをインストールします)。

便利な方法:

5
Eli Acherkan