2

我计划为一个不使用任何 ORM 工具的小项目实施身份映射。

我见过的大多数示例中的标准实现只是对象 id 的哈希,但是很明显哈希将无限增长。我正在考虑使用缓存过期的 memcahed 或 redis,但这也意味着某些对象将在缓存中过期,并且它们的数据将再次从数据库中的一个新的和不同的对象(不同对象下的相同实体记忆)。

考虑到大多数 ORM 不需要运行 memcached/redis。他们如何解决这个问题?他们真的解决了吗?有一个由重复实例表示的实体不是一个问题吗?

我知道的唯一解决方案是支持智能指针并在哈希中存储弱引用的语言。在我看来,Ruby 无法采用这种方法,所以我想知道这种模式通常是如何由 Ruby ORM 实现的。

4

1 回答 1

1

我认为他们确实使用了 Hash,当然看起来 DataMapper 使用了hash。我的假设是身份映射是每个“会话”的,它可能在每个请求之后被刷新(也确保事务在请求边界结束时被刷新)。因此,它可以无限增长,但有一个固定的视野来清除它。如果打算让会话持续更长时间并且需要定期清理,那么WeakRef可能有用。但是,对于长时间维护身份映射,我会持谨慎态度,尤其是在涉及并发并且对一致的事务更改有任何期望的情况下。我知道 ActiveRecord 考虑添加一个 IdentityMap,然后放弃了这项工作。根据获取行的方式,可能会出现重复,但可能比您想象的要少,或者应该重新考虑查询。

于 2014-08-09T17:54:10.143 回答