2012-03-21 3 views
6

私はきれいな解決策がないという問題に直面しています。私はJavaアプリケーションを作成しており、アプリケーションは限られたファイルセットに特定のデータを格納しています。私たちはデータベースを使用していません。普通のファイルです。ユーザーがトリガーしたアクションのため、特定のファイルを変更する必要があります。私はこれを全然ないか何かの操作にする必要があります。つまり、すべてのファイルが更新されるか、またはいずれも更新されません。たとえば5つのファイルのうち2つが変更された場合、もう1つはIOExceptionが原因ではない場合は悲惨です。java - 2つのファイルをアトミックに書き込み

これを達成するための最良の戦略は何ですか? hsqldbのようなメモリ内のデータベースを埋め込むことは、この種のアトミック/トランザクション動作を得る良い理由ですか?

ありがとうございます!

答えて

5

安全なアプローチはIMOです:

  1. バックアップ
  2. は、処理されたファイルは例外で
  3. のリストを維持するバックアップ1で処理されたものを復元します。

これは時間がかかることになるか、時間などの制限に依存します。

2

これを達成する最適な戦略は何ですか? hsqldbのようなメモリ内のデータベースを埋め込むことは、この種の原子性/トランザクション動作を得る良い理由ですか?

はい。トランザクションの振る舞いが必要な場合は、信頼性の低い基板の上に自分自身をロールするのではなく、それを念頭に置いて設計された十分にテストされたシステムを使用してください。


ファイルシステムは、一般に複数のファイルを含むトランザクションをサポートしていません。

Windows以外のファイル・システムとNTFSを使用すると、すべてのファイルをデータベースと

  • を使用することはできませんので、もし、あなたがアトミックファイルの交換を行うことができますプロパティを持って合理的に小さなものの下にある傾向があります

その後、あなたは次のことを行うことができます:あなたのアプリケーションが所有しており、一つの物理ドライブ上に保存されている

  • ディレクトリ
    1. 適切なハードリンクを使用してディレクトリの内容をコピーします。
    2. 5つのファイルを変更します。
    3. アトミック元
  • 1

    とディレクトリの修正されたコピーを交換アイブ氏は、成功とアトミックファイル操作のためのApacheのコモンズ取引ライブラリを使用。これにより、ファイルをトランザクションで修正したり、失敗した場合にロールバックすることができます。ここで

    はリンクです: http://commons.apache.org/transaction/あなたは一度、すべてのファイルがロックされているすべてのファイルをロックし、それらだけに書き込めません

    0

    +0

    ファイルがロックされていてもIOExceptionが発生する可能性がありますか? – user1284566

    +0

    ああ、そうです。 – Jonatan

    1

    私のアプローチは、あなたのJavaコードでロックを使用することです。したがって、毎回、1つのプロセスだけが何らかのファイルを書き込むことができます。私はあなたのアプリケーションがファイルを書き込む唯一のものだと仮定しています。 あなたのファイルを "ロールバック"するのにいくつかの書き込み問題が発生する場合は、上のようなファイルのコピーを保存する必要があります。

    関連する問題