私たちのプロジェクトでは、いくつかのデバイスに関する現在の情報を保存する必要があります。デバイスはこれらの情報を定期的にサーバーに送信します。サーバーは受信した情報を複数のテーブルに保存し、デバイスの現在の状態を示す同期リスト内のオブジェクトも更新します。
データベースの負荷が高くなるのを避けるために、一部のビューは同期されたリストを介してキャッシュされたオブジェクトにアクセスし、要求されたデバイスのステータス情報を表示します。
同期されたリストはサービス クラス内に配置され、次のようになります。
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 を使用)
これらのソリューションについてどう思いますか? また、説明されているシナリオに対してより良いソリューションはありますか? 新しく導入されたキャッシュ プラグインを使用してステータス オブジェクトを保存し、一意のキー以外の属性でそれらにアクセスできますか?