切尔斯基的ORM问题域 ,他提供了Hibernate的解答,现在来看看在ActiveRcord中是如何解决的。大多数解决方案都大同小异,但有些完全不同。
同样,“更多的时候,这是一个建模问题”。使用eager load还是lazy load是用户的选择,根据特定场景而定。
ActiveRecord和Hibernate一样,即可以在模型之间指定load方式,也可以在特定查询里面eager load,根据上句话,后者是更好的选择。
Session per request, Open Session in View pattern
Database Connection
在非线程安全时,每个application instance都会被分配一个database connection。实现线程安全之后:
切尔斯基已经做了解答:
答案未知。
基本上在transaction commit的时候。另外reload方法也会导致内存状态和持久存储状态的更新。
5. 如何确保在出错时保持对象内存状态和持久存储状态之间的一致性
这个答案跟Hibernate的实现有很大不同(至少目前,Rails2.3.6)
ActiveRecord没有实现Identity Map。当然你要是想用,可以在这里找到一个简单实现:http://github.com/pjdavis/identity-map 。不过ActiveRecord的identity map好像已经在计划之中了。
所以,如果两个对象持有同一个record,则互相并不会知道对方的存在。如下:
user1 = User.find(1) user2 = User.find(1) user1.update_attribute(:name => 'fuck') user2.save // 覆盖上个更新
N+1查询问题
分离查询模型和存储模型
尽量减少查询语句
关于1和3,在我的这篇文章中有详细解释:http://huzhenbo.name/blog/2010/01/16/rails-performance-tuning
ActiveRecord的query cache起到和Hibernate中的session一样的第一级缓存的作用。
http://martinfowler.com/eaaCatalog/identityMap.html
http://takacsot.freeblog.hu/Files/martinfowler/identityMap.html
----EOF----