0

私たちのプロジェクトでは、いくつかのデバイスに関する現在の情報を保存する必要があります。デバイスはこれらの情報を定期的にサーバーに送信します。サーバーは受信した情報を複数のテーブルに保存し、デバイスの現在の状態を示す同期リスト内のオブジェクトも更新します。

データベースの負荷が高くなるのを避けるために、一部のビューは同期されたリストを介してキャッシュされたオブジェクトにアクセスし、要求されたデバイスのステータス情報を表示します。

同期されたリストはサービス クラス内に配置され、次のようになります。

private Map<Long, DeviceStatus> statusMap = java.util.Collections.synchronizedMap(new HashMap<Long, DeviceStatus>()) // key = unique id

サービス API は、id またはその他のプロパティによってエントリを更新、削除、リストするためのメソッドを提供します。

より多くの実行中のインスタンス間でステータス情報を共有できないため、現在のソリューションには満足していません。さらに、そのようなリストのメモリ使用量を監視することはできません。

私たちは2つの解決策を考えています:

解決策 1:

頻繁に更新される情報を格納するための HSQLDB データベースの導入 (dataSource プラグインの助けを借りて)。このソリューションでは、findBY などのすべての GORM 機能が残ります。短所: 複数のシステム間でのストレージの分散。

解決策 2:

POJO DeviceStatus をドメイン クラスとして実装し、キャッシュ可能にします。将来、terracotta を使用して、キャッシュされた情報を複数のシステムで共有できます。欠点: この情報をデータベースに保存する必要はありません。ドメインクラスのみをメモリ内に保存する方法またはオプションはありますか。起動時に、DeviceStatus キャッシュは、複数のデータ ソース (テーブル) から情報をフェッチすることによって初期化されます。

要件:

  • findBy などのメソッドを使用してキャッシュされたオブジェクトにアクセスする
  • 複数のシステムにキャッシュを分散 (ehcache と terracotta を使用)

これらのソリューションについてどう思いますか? また、説明されているシナリオに対してより良いソリューションはありますか? 新しく導入されたキャッシュ プラグインを使用してステータス オブジェクトを保存し、一意のキー以外の属性でそれらにアクセスできますか?

4

2 に答える 2

0

EhCache の使用を検討しましたか? EhCache は、ドメイン クラスだけでなく、任意のオブジェクトをキャッシュするために使用できます (ただし、Hibernate の第 2 レベルのキャッシュとして使用できます)。メモリ内キャッシュがいっぱいになったときにオブジェクトを透過的にディスクにオーバーフローさせるように EhCache を設定して、メモリ不足の状況を防ぐことができます。

すべてのキャッシュをノード間で同期する必要がある場合は、Terracotta を分散キャッシュとして使用できます。Terracotta は EhCache と互換性があります。

そうでなければ、あなたの質問は少し不明確に思えます。これらのドメイン オブジェクト全体でクエリ機能が必要ですか?

于 2013-12-28T02:58:13.210 に答える
0

memcache http://memcached.orgを見ましたか? これは、セットアップが簡単なオープン ソースのメモリ内キャッシュ システムです。使用可能な任意のサーバーをプールに追加できます。キー/値でデータを保存するので、何を詰め込んでもシリアライズ可能であることを確認してください。Web アプリケーションから独立した層として実行されるため、どのアプリケーション インスタンスもテラコッタを必要とせずにアクセスできます。これは、JVM クラスター共有メモリに役立つと理解しています。

于 2012-07-12T15:08:59.170 に答える