2011-02-08 5 views
4

私が取り組んでいるプロジェクトは、オブジェクトやオブジェクトのコレクションをデータベースから取得する方法のジレンマに直面しています。場合によってはオブジェクトIDを設定してそのプロパティをオンデマンドで照会するだけで便利な場合があります(オブジェクトごとに1 db呼び出しですべてのプロパティを取得することが便利な場合もあります) )。そして多くの場合、コレクションはバッファリングオブジェクトをメモリにサポートし、オンデマンドアクセスのための最小限の情報で初期化する必要があります。結局のところ、すべてをメモリにバッファリングすることはできず、オンデマンドですべてを読み取ることはできません。ユビキタスメモリとIOの問題です。ビジネス層設計のジレンマ:メモリまたはIO?

誰も同じ問題に直面しなければなりませんでしたか?あなたのデザインにどのような影響がありましたか?難しい教訓は何ですか?その他の考えやアドバイスは?

EDIT: myプロジェクトは、Webアプリケーション、Webサービス、およびデスクトップアプリケーションで使用されるビジネスレイヤーdllの典型的な例です。製品のリストがデスクトップアプリケーションのために要求され、製品名のみで表示される場合、すべての製品を表示するためにこの一連の手順を実行することができます(データベースには何百万もの製品が存在するとします)。
1. dbコールを使用してすべての製品名を取得する
2.ユーザーが製品をクリックして詳細を表示する(オンデマンドアクセス)場合、すべての製品情報を取得する1回のdbコール

ただし、この同じAPIが消費される場合Webサービスですべての製品を詳細に表示すると、ネットワークトラフィックは煩雑になります。
1. 1回のdbコールですべての製品と製品のフィールドをバッファリングします(この場合、100万の製品をバッファリングすることも恐ろしく見えます)

答えて

6

データの頻度変更。静的およびほぼ静的なデータをキャッシュするのが一般的です(通常、キャッシュの有効期限ウィンドウを使用します)。

データベースはすでにデータをキャッシュするように設計されているので、ネットワークI/Oはボトルネックではないので、データベースはそれがうまくいくようにします。

利用可能なキャッシング技術を見てきましたか?

+0

リンクありがとうございます! Velocityの記事は読んで楽しいものでした...静的なデータは、社内のキャッシュに既にキャッシュされています。静的でない他のデータはまったくキャッシュされず、メモリに完全に読み込まれません(フィールドはオンデマンドでアクセスされます)。このような動的データの場合、メモリに完全に読み込むべきか部分的に読み込むべきかを決めるのは難しいです。アドバイスをいただきありがとうございます。 – kateroh

2

これは、人気のPではありません絶対に必要な場合を除いて、またはすぐに「インターネット規模」にする必要があることがわかっている場合は、すべてのキャッシングを避けてください。データベースの上の階層化キャッシュをスケールアウトしようとしましたか?あなたはキャッシュをライトスルーし、LRUオブジェクトが変更を書き込むのを読むか待つだけですか?別のアプリケーションまたはWebサービス層がDBの上に座って一貫性のない読み込みを取得するとどうなりますか?

最新のデータベースにはすでにキャッシュがあり、あなたよりも優れたものを実装できる可能性があります。何か必要なときにいつでもDB配線にヒットするかどうかを判断するだけです。大多数のケースでは、DBはうまく機能し、一貫性を保ちます。BASEとCAPの理論はお話しして想像するのが楽しくて楽しいですが、時には良い古いデータベースに当たっただけではコストを押し上げることができません。ストレステストとホットスポットを決定し、必要に応じて控えめにキャッシュを実装します。

+0

オリジナルの問題は、単にキャッシュ対データベースヒットの問題ではありません(プロジェクトにはあまり頻繁に変化しないオブジェクトのためのキャッシュが既に存在しています)。 get-allメソッドが、最小データを取得し、必要に応じて残りのデータを返すのではなく、すべてのデータをメモリに読み込む必要があるかどうかの問題です。また、データが失効する可能性も低くなります。 – kateroh

+0

@kateroh - あなたは常にキャッシュを通過する場合、すべてがうまくいくということです。キャッシュを無効にせずに耐久性のあるデータを作成する他のレイヤーがあると、結果が一貫しなくなります。 (ほとんど)ステートレスであるWebは、このようなトランザクションシステムとの不一致ですが、キャッシュの不一致や一貫性のオーバーヘッドによって何回もBURNEDされました。 – Xailor

+0

@kateroh - 個人的に、KISSして、必要に応じてDBに照会してください。 – Xailor

関連する問題