web-dev-qa-db-ja.com

java.util.PrefsがBackingStoreExceptionをスローする-なぜですか?

起動時の小さな/単純な結果をキャッシュするシステムがありますSOAP呼び出し

起動時にキャッシュをリロードできるようにするインスタンスが必要です(SOAPサービスが停止している場合)。また、このキャッシュファイルを使用して複数のインスタンスの可能性を処理する

Java.util.prefsを使用することを選択しましたが、Javaの組み込み自動同期スレッドが断続的に失敗し(デフォルトのJVM 30sバッキングストア同期を使用すると、時間の1%)、次の例外がダンプされます。

Jan 8, 2010 12:30:07 PM Java.util.prefs.FileSystemPreferences syncWorld
WARNING: Couldn't flush user prefs: Java.util.prefs.BackingStoreException: Couldn't get file lock.

疑わしい このバグ ですが、これは1.5(tiger-b40)で修正され、このボックスのJava 5は「1.5.0_16-b02」です。

これは、他のマシンでは発生しないようですが、このバッキングストアを共有する複数のJVMがあるためと考えられます。

誰でもこれを確認できますか?もしあれば、リスクは何ですか?

私のアプローチに欠陥がある場合、代わりに何を使用すればよいですか?

20
HaveAGuess

"これは、このバッキングストアを共有する複数のJVMがあるためと思われます"

これは絶対に当てはまる可能性があります! 2つのJVMが同時にファイルをロックしようとすると、これが表示されます。

正確な詳細は、ロックの種類、オペレーティングシステム、ファイルシステムによって異なります。

これを引き起こす操作をtry/catchブロックでラップしてみて、失敗した場合は操作を再試行してください。

10
Kevin Wright

私は桟橋で同じ問題に遭遇しました。次の問題が解決したことがわかりました。

JREディレクトリに.systemPrefsを追加し、不平を言っているプロセスを実行しているユーザーにアクセスを提供します。

それが完了したら、Jettyディレクトリに移動してstart.iniファイルを開きます

-Djava.util.prefs.userRoot={user's home directory}

-Djava.util.prefs.systemRoot={user's home directory}

それらの行を追加し終えたら、突堤を再起動し、エラーがなくなっていることを発見しました。

1
user2981810

設定を使用する代わりに、シリアル化可能なマップを使用して、ランダムに生成された一時ファイル名(最初の初期化時にファイル名が生成される)にシリアル化および逆シリアル化する非常に単純なキャッシュクラスを作成します。これは単なるキャッシュであるため、例外をキャッチし、例外が発生したときにキャッシュを初期状態にリセットして、元のデータソース(SOAP=あなたのケースではサービス)なので、もし望まないのであれば、serialVersionUIDやその互換性について心配する必要はありません。

0
Robin Green