在我们的项目中,我们必须存储有关多个设备的当前信息。设备定期将这些信息传输到服务器。服务器将接收到的信息存储在几个表中,并更新同步列表中的对象,这些对象显示设备的当前状态。
为了避免繁重的数据库负载,一些视图通过同步列表访问缓存对象以显示请求设备的状态信息。
同步列表位于服务类中,如下所示:
private Map<Long, DeviceStatus> statusMap = java.util.Collections.synchronizedMap(new HashMap<Long, DeviceStatus>()) // key = unique id
服务 API 提供了用于更新、删除、...按 id 或其他属性列出条目的方法。
我们对当前的解决方案不满意,因为您无法在更多正在运行的实例之间共享状态信息。此外,不可能监控此类列表的内存使用情况。
我们正在考虑两种解决方案:
解决方案1:
引入 HSQLDB 数据库(借助 dataSource 插件)来存储经常更新的信息。使用此解决方案,所有 GORM 功能(如 findBY)都将保留。缺点:几个系统之间的存储分布。
解决方案2:
将 POJO DeviceStatus 实现为域类并使其可缓存。将来,兵马俑可用于在多个系统上共享缓存的信息。缺点:我们不需要将这些信息存储在数据库中。有没有办法或选项只在内存中存储域类。在启动期间,通过从多个数据源(=表)获取信息来初始化 DeviceStatus 缓存。
要求:
- 使用 findBy 等方法访问缓存对象
- 在多个系统上分布缓存(使用 ehcache 和 terracotta)
您如何看待这些解决方案?对于所描述的场景是否有更好的解决方案?我们可以使用新引入的缓存插件来存储状态对象并通过唯一键以外的其他属性访问它们吗?