【发布时间】:2016-04-12 13:19:47
【问题描述】:
所以我有一个从 ORM / Hibernate 相互引用的对象链
- 大陆
- 有很多国家
- 有很多州
- 有很多城市
- 有许多城市区域
- 国家
- 有一个国家
- 有很多州
- 有很多城市
- 有许多城市区域
- 状态
- 有一个大陆
- 有一个国家
- 有很多城市
- 有许多城市区域
- 城市
- 有一个大陆
- 有一个国家
- 有一个州
- 有许多城市区域
- 城市部分
- 有一个大陆
- 有一个国家
- 有一个州
- 有一个城市
对于某些方法,我需要能够进行一些快速查找以识别键。
因此,我目前在所有具有 Many 的对象中都能够快速查找内存中对象的 Id,而无需在执行线程的生命周期内触发大量数据库查询
HashMap<Integer,Country> countriesTable
HashMap<Integer,State> statesTable
HashMap<Integer,City> citiesTable
HashMap<Integer,CityPart> citypartsTable
但我担心的是循环引用被持有,并且对象永远不会被垃圾收集清除,因为它们都通过 ORM 关系相互引用,并且它们都有指向 eachohter 的私有映射
现在我已经阅读了有关 WeakHashMap 的信息,如果没有更多的强引用,它将清除引用。
问题是在我的情况下使用 WeakHashMap 是否值得推荐,或者 Hashmap 是否可以为我提供足够的服务,并且这种设置和循环引用不会影响我的内存管理。
【问题讨论】:
-
有什么方法可以改变你的设计来消除循环引用?
-
循环引用不会停止垃圾收集(尽管出于其他原因它们通常不是一个好主意)。 WeakHashMap 不是一个好的缓存解决方案。在您可以证明进行数据库查找的“正确”解决方案不起作用之前,您不应该考虑缓存。
-
此外,由于您开始拥有这些结构,您可以很好地使用同步工厂方法来获取实例,并让工厂方法在创建新实例之前检查实例是否已经存在(因此您确保每个实体都有一个实例)。重要提示:过早的优化是 99% 万恶之源。
-
此外,Hibernate 有自己的缓存解决方案,大多数现代 JDBC 驱动程序也有。很有可能你真的完全不需要担心这个。
-
如果循环引用会导致垃圾收集问题,那么 ORM 工具中的所有双向映射都将是即时内存泄漏。相信你使用的工具,不相信你编写的未经测试的代码。
标签: java hibernate hashmap weak-references weakhashmap