在我们的项目中,我们必须存储有关多个设备的最新信息。设备定期将这些信息传输到服务器。服务器将接收到的信息存储在多个表中,并更新同步列表中的对象,这些列表显示设备的当前状态。
为避免数据库负载过重,某些视图会通过同步列表访问缓存的对象,以显示所请求设备的状态信息。
同步列表位于服务类中,如下所示:
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缓存。
要求:
您如何看待这些解决方案,是否有针对所述方案的更好解决方案?我们是否可以使用新引入的缓存插件来存储状态对象,并通过除唯一键之外的其他属性来访问它们?
答案 0 :(得分:0)
你看过memcache http://memcached.org吗?它是一个开源的内存缓存系统,易于设置。您可以将任何可用的服务器添加到池中。您可以按键/值存储数据,这样就可以确保填充的内容是可序列化的。它将作为Web应用程序的独立层运行,因此您的任何应用程序实例都可以访问它而不需要我所了解的赤陶,这有助于您的JVM集群共享内存。
答案 1 :(得分:0)
你考虑过使用EhCache吗? EhCache可用于缓存任何对象,而不仅仅是域类(尽管您可以将它用作Hibernate的二级缓存)。当内存缓存已满时,您可以将EhCache设置为透明地将对象溢出到磁盘,以防止内存不足。
如果您需要跨节点同步所有缓存,则可以使用Terracotta作为分布式缓存,Terracotta与EhCache兼容。
否则你的问题似乎有点不清楚;你需要跨这些域对象的查询功能吗?