Java Webアプリケーションでは、設定データ、メッセージデータ、コード保守データなどのすべての重要なデータが適切であるかどうかを知りたいですか? 、ドロップダウン・オプション・データなど(すべてのデータが頻繁に更新されないことを前提とする)は、サーバの起動時にデータベースから「静的」変数としてロードされます。
また、リクエストごとにdbを照会してデータを取得する方が望ましいですか?
アドバイスありがとうございます。起動時のすべての重要なデータを取得する
答えて
アプリケーションのライフサイクル中に変更されないすべてのデータを取り出し、シングルトンなどのメモリに保持することは完全に有効です。
これは、DBのヒット率を節約し、検索が高速であるため、良い考えです。多くの環境固有の設定やその他のデータは、一度取り出すことができ、将来の要求に対して不変ハッシュマップに保持されます。
一般的なweb-appでは、大量のメモリを消費してOOMを引き起こす可能性のある多くの設定データ/オプションオブジェクトがありません。しかし、何十万もの設定データを持つテーブルを持っている場合は、要求されたときにオブジェクトを取得する方がよいでしょう。そしてもしあなたがなら、はMemcacheDのようないくつかのキーバリューストアに入れておきたいと思います。
多くのDBヒットを避けるために、DBを使用して設定値とehcacheを格納しました。この方法では、メモリ消費について心配する必要はありません。
Ehcacheのは、多くの利用可能なDBキャッシュソリューションの一つであり、JPAの上に設定することができるなど
あなたはehcacheを(または他の多くのキャッシュ・プロバイダー)、読み取り専用のテーブルを考えるために設定することもでき、その場合にそれを明示的にキャッシュを無効にするように指示された場合にのみ、DBに移動します。これはかなりうまくいく。読み取りが非常に頻繁に(100 /秒のように)発生する場合でもオーバーヘッドが表示されますが、通常はローカル変数に設定値を格納し、内部ループを読み取らないようにして呼び出し中にメソッドスタックを渡すことは避けてください。
Javaオブジェクトとしてのシングルトンに値を格納するのが最適ですが、appなしでこれらを変更したい場合は、起動すると、やや複雑になります。ここで
は、Javaオブジェクトとの動的な構成を実現するための簡単な方法です:それはあなたのだろうと考えにくいですが
private volatile ImmutableMap<String,Object> param_value
基本的には、マルチスレッドのアクセスについて考え始める必要があり、かつメモリの問題(よ設定値などのバイナリデータを持たない限り、設定値のためにメモリが不足します。
本質的には、コードの一部に高性能が必要な場合を除いて、DBと一部のキャッシュプロバイダを使用することをおすすめします。
EhCacheと「Javaオブジェクトを使用した動的設定」をご紹介いただきありがとうございます。後ほど詳しく説明します。 :) – Cube
- 1. Firebaseはアプリの起動時にすべてのデータを取得します
- 2. 世界中のすべての重要な取引所の価値を得る
- 3. IE7が起動時にすべてのファビコンを取得するのはなぜですか?
- 4. スプリングブート。 SQLスクリプトを実行し、アプリケーションの起動時にデータを取得する
- 5. 起動時のビーコンメッセージの取得
- 6. iOSアプリの起動時にApple Watchアプリがデータを取得する
- 7. python win32service - サービス起動時の起動情報の取得
- 8. Qt現在のアプリケーションの起動時間を取得する
- 9. プログラムの起動時にBPLのバージョンを取得する
- 10. アプリの起動時にすべての画像をプリロードする
- 11. すべてのデータを取得しますが、自動インクリメント
- 12. IBMリバティー・サーバーの起動時にNoClassDefFoundErrorを取得する
- 13. アプリの起動時に場所を取得する方法
- 14. コードでSpringアプリケーションの起動時間を取得する
- 15. アプリの起動時にバレンタインテスト画面を取得する
- 16. 春の起動時にapplication.propertiesからプロパティを取得する
- 17. 特定の日付時刻の間にすべてのデータを取得する
- 18. grails-datastore-gormで春の起動時にすべてのドメインクラスを取得する方法は?
- 19. すべての起動時に更新を確認する
- 20. アスタリスクpjsip起動時にすべてのエンドポイントをロードする
- 21. シェフのすべての再起動要求を無視する
- 22. 春の起動時に@OneToMany注釈を取得しない
- 23. Androidフラッシュライトアプリが他のすべての起動時にクラッシュする
- 24. 起動後にすべてのエンドポイントリストを取得する方法、スプリングブート
- 25. 使用重量のあるすべてのタグを取得
- 26. My Forループが速すぎて重要なデータを取得できません
- 27. 起動時にすべての必要なインクルードファイルが存在することを確認する方法
- 28. アプリケーションの再起動時にArrayListを取得しますか?
- 29. RPCサーバーの起動時に「エンドポイントは重複しています」
- 30. のConfigParserは重複してすべてのキーを取得
このアプローチではメモリだけが問題になるのでしょうか?
私は* OutOfMemory *が将来的に成長を続けるのではないかと心配しています。 – Cube
@キューブどのようにテーブルといくつの行を設定として持つことができるか検討してください。 '3000'があり、' 10'文字列フィールドには '1000' charの各文字列が設定されています。あなたは '30MB 'を取るでしょう - これはあまりありません。あなたのデータが '30K'の設定オブジェクトの10倍になっても、効率的にそれを出せばウェブサーバでは高くない '300MB 'を食べるでしょう。しかし、30Kの設定オブジェクトは現実的ではありません。多くの設定がある場合は、設定オブジェクトの保存にMemcahceDを使用することを検討してください。 – Nishant
非常に良いexplaination!あなたは私の疑いを解決しました。:) – Cube