我们有一个父对象,其中包含500.000个子对象的集合。我们使用Hibernate与ehcache作为缓存提供程序进行映射。对实体和集合使用二级缓存可以正常工作,因为我们可以避免对数据库的请求。
但是,通过二级缓存加载500.000个对象仍然会产生大量的CPU和内存垃圾,并导致几秒钟的响应时间。由于子对象不是不可变的,我们无法启用hibernate.cache.use_reference_entries属性。
在hibernate二级缓存的顶部使用dao对象的应用程序层缓存,没有cpu,也没有垃圾内存开销。响应时间是几毫秒而不是秒。
但这个解决方案的最大缺点是,我们必须自己管理这个缓存。在群集多线程系统中包括失效和同步。
我的问题是,如果有一个更好的解决方案,具有低CPU和垃圾的优势?有没有人有处理大型藏品的经验?
答案 0 :(得分:0)
你真的需要一次500k吗?
您可以从Parent中删除该集合,并通过父级SELECT c FROM Child c WHERE c.parent = :parent
查询Child中的对象,并在不需要500k时添加分页或过滤。
您还可以将数据加载为DTO,这可以提高内存性能,因为hibernate不会将这些DTO视为脏检查。我想这会将内存占用减少一半,尽管我从来没有对它进行过基准测试。此外,DTO允许您省略在此特定用例中不需要的属性,从而节省内存和CPU。
您还可以在Hibernate 5中查看enableDirtyTracking
。