6

そのため、メッセージングネットワーク上のユーザーからのメッセージをファイルに書き込もうとしています。私は、優れたJavaプラクティスと適切なファイルIO技術を使用してこのプログラムを構築しようとしています。

現在、私のプログラムは誰かがメッセージを投稿したことを認識し、メッセージを受け取り、すぐにファイルに書き込みます。ファイルオブジェクトの作成、ライターオブジェクトの作成、メッセージの追加、ファイルのクローズファイルがすぐに再び開かれるため、不要なアクションが発生します。

次に、ファイルを開いたままにして、ファイルに届いたメッセージを書き込んでから、定期的に閉じたらどうなるかを考えました。それは良い習慣ですか?ファイルを長期間開いたままにしますか?たとえば、1時間後、またはある程度のデータが書き込まれた後ですか?

今、私はメッセージを受け取り、それらを「キャッシュ」(文字列配列のような)に保存し、「キャッシュ」がいっぱいになったときに文字列配列をファイルに保存する必要があると考えています。これはより良い習慣ですか?

だから私は2つの質問があります:

1)ファイルを使用しない場合は、ファイルを長期間(数分から数時間)開いたままにしておくことをお勧めしますか?

2)私が話しているような「キャッシュ」の良い習慣は何ですか?文字列配列は良いですか?私が使うべきより良いものはありますか?この情報をどのように保存しますか?

4

3 に答える 3

3

ファイルを長時間開いたままにしておくのはまったく問題ありません。それは確かにそれを繰り返し開閉するよりもはるかに優れています。開いている単一のファイルによって消費されるリソースの量はごくわずかです。あなたの唯一の懸念はあなたがたくさんの開いているファイル(数百または数千)を持っているかどうかです。プログラムの開始時にファイルを開き、終了時にファイルを閉じることをお勧めします。

適切なツールを使用して、プログラムまたはシステム上の他のプログラムによって保持されている開いているファイルを調べると、それらすべてが、生涯にわたって開いているいくつかのファイル(数から数十)を保持していることがわかります。プログラムのコード(実行可能ファイル、共有ライブラリ、およびJavaプログラムのJARファイル)。これらは開かれてからメモリマップされ、多くの場合ファイルもログに記録されます。これは正常で安全です。

ここで、この間にストリーム(またはライター、または、または使用するもの)をフラッシュする必要があります。RandomAccessFileその時点までに書き込まれたすべてのデータが安全にディスクに書き込まれていることを確認する必要があるときはいつでも、これを行う必要があります。これは、すべてのメッセージの後である場合もあれば、適切と思われる場合は、特定の数のメッセージ、データの量、または期間の後である場合もあります。

于 2012-12-20T00:42:32.237 に答える
3

私の意見では、サーバー アプリケーションのログ (および類似のログ) のベスト プラクティスは、許容できる時間遅延を決定し、それに固執することです。たとえば、5 秒の遅延を設定する場合、次のようにコードを記述します。

  • ログに何かを書き込むと、「本当に」5 秒以内に書き込まれます。
  • 5 秒前に他の何かが書き込まれた場合、それはバッファに追加されます (時間切れになったときに書き込まれます)。

そうすれば、5 秒ごとに最大 1 回のディスク書き込みしかできませんが、確実に書き込まれます。これは、他のアプローチとよく比較されます。

  • 何かが書き込まれるたびにデータをディスクにフラッシュするが、負荷が増加し、たとえば 1 秒あたり 10,000 件のイベントがある場合、1 秒あたり 10,000 回のディスク書き込みで I/O 時間を浪費することになります。
  • いつデータをフラッシュするかを Java/OS に任せても、負荷が非常に低い場合 (真夜中など)、ログが何時間も古くなる可能性さえあります。(1 つのイベントがあり、バッファを埋めるのに十分な大きさでない場合、何時間も何もありません。)

最近、この戦略を実行する組み込みの方法があるかどうかを確認するために API を調べていませんが、コーディングは簡単です。ところで、手動で出力をキャッシュする必要はありません。BufferedOutputStream を使用して、ディスクに書き込みたいときはいつでも flush() オブジェクトを呼び出すことができます。(そうすれば、バッファ制限に達したときにも自動的に書き込みますが、制限を賢明に選択すればおそらく問題ありません。)

ファイルを開いたままにしておくことに関しては、好きなだけファイルを開いたままにしておくことができます (これ以上書き込みを行うつもりがない場合は、ファイルを閉じてください)。何千ものファイルを開いておらず、複数のアプリケーションで同じファイルに書き込む必要がないと仮定すると、問題は発生しません。

于 2012-12-20T00:46:42.460 に答える
1

1) ファイルを使用していない場合、ファイルを長時間 (数分から数時間) 開いたままにしておくことをお勧めしますか?

これは、プログラムに送信されるメッセージの数と各メッセージのサイズに依存すると思います。あなたの記憶があなたの計算に満足できるなら、あなたはそれについて考えることができます. しかし、各メッセージが来るたびにデータベースに書き込むことを考えます (ブロブの可能性があります)。また、ファイルへの書き込み中にプログラムがクラッシュした場合に何が起こったかも考えてみてください。メモリに保存されているメッセージ全体が失われる可能性があります。

2)私が話しているような「キャッシュ」の良い習慣は何ですか?文字列配列は良いですか? 私が使うべき良いものはありますか?この情報をどのように保存しますか?

サイズがわかっている場合は、メモリ配列にデータを一時的に保存する場合は問題ありません。それ以外の場合は、ArrayList を使用できます。

于 2012-12-20T00:33:41.527 に答える