身份映射模式的Ruby实现

时间:2014-08-09 15:49:12

标签: ruby identity-map

我打算为一个没有使用任何ORM工具的小项目实施identity map

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

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

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

1 个答案:

答案 0 :(得分:1)

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