2

階層化されたWebアプリを開発しています。簡単に言えば、それは:

UI:html、javascript、jquery
ドメインロジック:Javaとサーブレット
ビジネスロジック:MySQL

データベースには、本に関する情報を含む大量のレコードがあります。さらに、アプリケーションは同時に多くのユーザーによって使用されます。ユーザーが検索テキストフィールドに本の「名前」、たとえば「book1」を入力し、jqueryオートコンプリートを使用してドロップダウンリストを表示できるようにしたい。

データベース内のレコードは変更されないため、更新できません。

堅実なデザインパターンを検討すると、どちらが優れているか(パフォーマンスと速度の面で):

これらのデータベースレコードをドメインロジックのキャッシュオブジェクトにプリロードし、ユーザーがこのオブジェクトからそれらを検索(クエリ)できるようにしますか?または、MySQL全文検索などを使用してデータベースから直接クエリを実行しますか?

MySQL全文検索を使用している場合、同時に多くのユーザーがデータベースを大量に呼び出すことを心配しています。キャッシュオブジェクトへのプリロードに関しては、これが一般的に良いソフトウェアプラクティスであるかどうかはわかりませんが、誰かがそれをお勧めしますか?レコードをメモリにキャッシュしたままにするためのタイマーを設定する必要がありますか?

これらの2つの方法のどちらが好ましいですか?そのようなシナリオのための他のより良い方法はありますか?

4

1 に答える 1

6

私は解決策を見つけ、この答えが同様の状況に対処している人々に役立つことを願っています。私は過去に頻繁に使用した、 IdentityMap
と呼ばれるソフトウェアエンジニアリングデザインパターンを使用します。

今回のみ、レコードは更新できない(つまり変更できない)ため、IDマップのキャッシュ機能のみを使用します。したがって、サーバーが起動したら、データベースからこのIDマップオブジェクトにレコードをロードします。このようにして、ユーザーはドメインレイヤーから直接クエリを実行するため、データベースへの呼び出しがより高速で少なくなります。

考慮すべき問題の1つであり、管理者が新しいレコードを追加する場合、この状況では「オブザーバーパターン」と呼ばれる別のデザインパターンを使用します(この本でそれについて学ぶことができます)。

更新:
同様の状況に対処している場合は、MySQLインデックスを使用することをお勧めします。「本の名前」の列で使用して、キャッシュオブジェクトの読み込みを高速化しました。私の場合、UIの検索フィールドを使用しているため、キャッシュオブジェクトには本の名前のみが含まれるためです。本の名前だけが気になります。PS:他の本の詳細は、ユーザーがドロップダウンリストで本の名前をクリックしたときにのみ読み込まれます。この時点で、詳細を保持している別のIDマップを使用することをお勧めします。このアーキテクチャの背後にある理由は、論理的に言えば、データベースのすべての本(詳細を含む)がアプリケーションのすべてのユーザーによって同時に検索(ロード)されることは決してないためです...したがって、サーバーのメモリと帯域幅を最小限に抑えることができます使用法最初に妥協して、利用可能なすべての本の名前をより高速に検索するために、本の名前の列全体をメモリにロードしますがそれらの詳細(つまり、メモリ内のより多くのスペース)は、ユーザーが必要とする場合にのみロードされ、同じ詳細で同じ本を検索する別のユーザーが使用するために別のIDマップに保持されます。私の意見では、これによりサーバーのメモリ使用量が最小限に抑えられ、他のユーザーが以前に取得した詳細を取得するためのデータベースへの呼び出しが少なくなります。

于 2011-12-12T18:32:36.623 に答える