切尔斯基的ORM问题域
,他提供了Hibernate的解答,现在来看看在ActiveRcord中是如何解决的。大多数解决方案都大同小异,但有些完全不同。
1. 加载根对象时如何避免加载大半个数据库
同样,“更多的时候,这是一个建模问题”。使用eager load还是lazy load是用户的选择,根据特定场景而定。
ActiveRecord和Hibernate一样,即可以在模型之间指定load方式,也可以在特定查询里面eager load,根据上句话,后者是更好的选择。
Session per request, Open Session in View pattern
Database Connection
在非线程安全时,每个application instance都会被分配一个database connection。实现线程安全之后:
写道
Instead of a single database connection for a given Rails instance, there will be a pool of connections, allowing N database connections to be used by the M requests executing concurrently. It also means allowing requests to potentially execute without consuming a connection, so the number of live, active connections usually will be lower than the number of requests you can handle concurrently.
2. 存储时如何更新整个对象图
切尔斯基已经做了解答:
切尔斯基 写道
框架支持级联更新. 是否应该级联更新, 哪些操作可以级联, 哪些不可以, 对象之间的哪些类型的关联可以级联, 哪些不可以, 则是程序员的责任。
3. 存储时如何高效地更新整个对象图
答案未知。
4. 何时同步对象的内存状态和持久存储状态
基本上在transaction commit的时候。另外reload方法也会导致内存状态和持久存储状态的更新。
5. 如何确保在出错时保持对象内存状态和持久存储状态之间的一致性
切尔斯基 写道
数据库事务回滚, 清空内存缓存, 重新加载
6. 如何保证引用的唯一性以避免可能的更新冲突
这个答案跟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 // 覆盖上个更新
7. 性能优化问题
-
N+1查询问题
-
分离查询模型和存储模型
-
尽量减少查询语句
关于1和3,在我的这篇文章中有详细解释:http://huzhenbo.name/blog/2010/01/16/rails-performance-tuning
8. ActiveRecord Query Cache
写道
Query caching is a Rails feature that caches the result set returned by each query. If Rails encounters the same query again during the current request, it will used the cached result set as opposed to running the query against the database.
ActiveRecord的query cache起到和Hibernate中的session一样的第一级缓存的作用。
Reference:
http://martinfowler.com/eaaCatalog/identityMap.html
http://takacsot.freeblog.hu/Files/martinfowler/identityMap.html
----EOF----
分享到:
相关推荐
Thing 是无网不剩(lzyy)用 SQLAlchemy 核心开发的一款 Rails ActiveRecord 风格 ORM。 SQLAlchemy 是 Python 界著名 ORM 框架,地位与 Java 界 Hibernate 类似。而 Thing 不是对 SQLAlchemy 的包装,只使用了其...
Castle简介 ActiveRecord 基于ActiveRecord持久层设计 Q & A
ActiveImporter能够加载电子表格或CVS文件的数据至任何类似ActiveRecord的ORM框架中
scala-activerecord是Scala的ORM库。 该库的灵感来自Ruby on Rails的ActiveRecord。 它是按照CoC(配置公约),DRY(请勿重复自己)的原则设计的。 最小的例子 样本片段: 模型实施: package models import ...
ActiveRecord::Migration def up create_table :posts do |t| t.string :title t.string :body t.timestamps end end 创建模型: 模型/post.rb class Post < ActiveRecord::Base end 创建控制器: ...
ActiveRecord简单实例_activerecord.zip
这意味着它是类似于ActiveRecord的Go ORM。 有100万个Go ORM,但没有一个与ActiveRecord一样好。 sqlboiler接近了,但是我不喜欢依赖于单独的配置文件,或者缺少迁移器。 关于GoRecord的含义是类似于ActiveRecord的...
基于ActiveRecord思想开发的至简化的java的Orm框架
Neo是一个基于JDBC开发的至简化框架,采用ActiveRecord的思想进行设计,名字源于《黑客帝国》男主角名字,为连接虚拟与现实的救世主,取名Neo寓意为链接数据和逻辑。源头来自于之前接触的一些不错的Orm框架,也有...
Orator ORM 提供了一个简单而优美的 ActiveRecord 实现。它有部分灵感来自于 Laravel 框架的数据库部分,但很大程度上修改为更 pythonic。功能特性:一个简单但强大的 ORM数据库不可知 Schema Builder一个低级别的...
scala-activerecord.zip,scala activerecord scalatraactiverecord类似于scala的orm库
版本太低,存在很多问题,于是在官方源码的基础上,我重新编译将其升级到了NHibernate基于.NET Framework 2.0的最高可用版本:2.1.2.4000。本资源包含Castle.ActiveRecord源文件和整套使用Castle.ActiveRecord所需的...
PluSQL:面向SQL爱好者的ORM 提供者: 对于了解SQL并喜欢它的人,PluSQL是基于ActiveRecord的非ORM。 尽管PluSQL是为PHP 5.3(特别是针对mysql / mysqli)编写的,但我希望人们能够以其他语言/框架提供非基于...
ORM的中文教程 英文的API 为什么是2分呢? 因为我很2 -_-!
将ActiveRecord中的NHibernate升级到3.3.0GA,排除编译的bug问题,保留ActiveRecord的完整功能,【Castle.ActiveRecord 升级NHibernate到3.4.0GA】的功能不完整!
Castle.ActiveRecord官方已经停止更新了,官方最高支持到NHibernate 3.1.0.4000,这个版本还有不少问题(例如:[NH-2213] - CLONE -Wrong parameters order in IQuery with SetParameterList and Filter)。...
Apress Pro ActiveRecord Databases with Ruby and Rails <br>Active Record has primarily been covered as a subsection, or maybe as a chapter or two, within a larger scoped book generally about the ...
[Gitter](https://badges.gitter.im/Join Chat.svg)定义用于将表格数据从电子表格或CSV文件加载到任何类似ActiveRecord的ORM中的导入程序。 安装将此行添加到应用程序的ActiveImporter![Gitter]...
Pro ActiveRecord Databases with Ruby and Rails.pdf
他几乎拥有了所有的特性,包括MVC, DAO/ActiveRecord, I18N/L10N, caching, jQuery-based AJAX support, 用户认证和基于角色的访问控制, 脚手架, 输入验证, 部件, 事件, 主题化以及Web services等. 用严格的OOP编码...