2011-02-09 4 views
1


Java Webアプリケーションでは、設定データ、メッセージデータ、コード保守データなどのすべての重要なデータが適切であるかどうかを知りたいですか? 、ドロップダウン・オプション・データなど(すべてのデータが頻繁に更新されないことを前提とする)は、サーバの起動時にデータベースから「静的」変数としてロードされます。

また、リクエストごとにdbを照会してデータを取得する方が望ましいですか?

アドバイスありがとうございます。起動時のすべての重要なデータを取得する

答えて

2

アプリケーションのライフサイクル中に変更されないすべてのデータを取り出し、シングルトンなどのメモリに保持することは完全に有効です。

これは、DBのヒット率を節約し、検索が高速であるため、良い考えです。多くの環境固有の設定やその他のデータは、一度取り出すことができ、将来の要求に対して不変ハッシュマップに保持されます。

一般的なweb-appでは、大量のメモリを消費してOOMを引き起こす可能性のある多くの設定データ/オプションオブジェクトがありません。しかし、何十万もの設定データを持つテーブルを持っている場合は、要求されたときにオブジェクトを取得する方がよいでしょう。そしてもしあなたがなら、はMemcacheDのようないくつかのキーバリューストアに入れておきたいと思います。

+0

このアプローチではメモリだけが問題になるのでしょうか?
私は* OutOfMemory *が将来的に成長を続けるのではないかと心配しています。 – Cube

+0

@キューブどのようにテーブルといくつの行を設定として持つことができるか検討してください。 '3000'があり、' 10'文字列フィールドには '1000' charの各文字列が設定されています。あなたは '30MB 'を取るでしょう - これはあまりありません。あなたのデータが '30K'の設定オブジェクトの10倍になっても、効率的にそれを出せばウェブサーバでは高くない '300MB 'を食べるでしょう。しかし、30Kの設定オブジェクトは現実的ではありません。多くの設定がある場合は、設定オブジェクトの保存にMemcahceDを使用することを検討してください。 – Nishant

+0

非常に良いexplaination!あなたは私の疑いを解決しました。:) – Cube

0

多くのDBヒットを避けるために、DBを使用して設定値とehcacheを格納しました。この方法では、メモリ消費について心配する必要はありません。

Ehcacheのは、多くの利用可能なDBキャッシュソリューションの一つであり、JPAの上に設定することができるなど

あなたはehcacheを(または他の多くのキャッシュ・プロバイダー)、読み取り専用のテーブルを考えるために設定することもでき、その場合にそれを明示的にキャッシュを無効にするように指示された場合にのみ、DBに移動します。これはかなりうまくいく。読み取りが非常に頻繁に(100 /秒のように)発生する場合でもオーバーヘッドが表示されますが、通常はローカル変数に設定値を格納し、内部ループを読み取らないようにして呼び出し中にメソッドスタックを渡すことは避けてください。

Javaオブジェクトとしてのシングルトンに値を格納するのが最適ですが、appなしでこれらを変更したい場合は、起動すると、やや複雑になります。ここで

は、Javaオブジェクトとの動的な構成を実現するための簡単な方法です:それはあなたのだろうと考えにくいですが

private volatile ImmutableMap<String,Object> param_value 

基本的には、マルチスレッドのアクセスについて考え始める必要があり、かつメモリの問題(よ設定値などのバイナリデータを持たない限り、設定値のためにメモリが不足します。

本質的には、コードの一部に高性能が必要な場合を除いて、DBと一部のキャッシュプロバイダを使用することをおすすめします。

+0

EhCacheと「Javaオブジェクトを使用した動的設定」をご紹介いただきありがとうございます。後ほど詳しく説明します。 :) – Cube

関連する問題