0

在我们的项目中,我们必须存储有关多个设备的当前信息。设备定期将这些信息传输到服务器。服务器将接收到的信息存储在几个表中,并更新同步列表中的对象,这些对象显示设备的当前状态。

为了避免繁重的数据库负载,一些视图通过同步列表访问缓存对象以显示请求设备的状态信息。

同步列表位于服务类中,如下所示:

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)

您如何看待这些解决方案?对于所描述的场景是否有更好的解决方案?我们可以使用新引入的缓存插件来存储状态对象并通过唯一键以外的其他属性访问它们吗?

4

2 回答 2

0

你看过 memcache http://memcached.org吗?这是一个易于设置的开源内存缓存系统。您可以将任何可用的服务器添加到池中。您通过键/值存储数据,因此只需确保您填充的任何内容都是可序列化的。它将作为您的 Web 应用程序的独立层运行,因此您的任何应用程序实例都可以访问它而无需兵马俑,据我所知,这有助于您的 JVM 集群共享内存。

于 2012-07-12T15:08:59.170 回答
0

你考虑过使用 EhCache 吗?EhCache 可用于缓存任何对象,不仅是域类(尽管您可以将其用作 Hibernate 的二级缓存)。您可以设置 EhCache 以在内存缓存已满时透明地将对象溢出到磁盘,以防止出现内存不足的情况。

如果您需要跨节点同步所有缓存,则可以使用 Terracotta 作为分布式缓存,并且 Terracotta 与 EhCache 兼容。

否则你的问题似乎有点不清楚;您是否需要跨这些域对象的查询功能?

于 2013-12-28T02:58:13.210 回答