ActiveJDBC 关联数据加载两种的模式

红薯 发布于 2011/07/21 07:52
阅读 1K+
收藏 2

假设两个 Model 类,一个是地址簿(Address),一个是用户 (User),二者是一对多的关系,一个用户有多个地址簿信息。

看看下面这段代码:

List<Address> addresses = Address.findAll();
 
for(Address address: addresses){
   User user = address.parent(User.class);
   System.out.println(user);
}

以上代码 ActiveJDBC 在执行的时候,会变成 1+N 条 SQL,如果你只关心 Address ,并不需要 User 的话,这种方法可以节省内存。但如果需要 User 资料时,这种方法的性能实在太差。

换另外一种方法来获取数据:

List<Address> addresses = Address.findAll().include(User.class);
 
for(Address address: addresses){
   User user = address.parent(User.class);
   System.out.println(user);
}

多了一个 include(User.class) 而已,立即将查询复杂度从 1+N 变成固定的 2 .

相当于 ActiveJDBC 会执行 findAll 的 SQL ,然后再批量加载 User 对象。

这个还是非常的方便。

加载中
0
hantsy
hantsy
相当蛋痛, ROR方式就很好吗。。。Spring Roo 也可以使用 充血模型,Spring Data JPA 支持更丰富的查询方式,findByusername_Password(带两参数)你根本不用实现,自动与Entity相匹配,自动查询。
0
chencliff
chencliff

就是不知道效率如何。

现在为了服务器的响应速度,所有取MetaData然后配对的直接排除,纯JDBC,代码上那个惨不忍睹。

0
随影求是
随影求是
必须要instrumented下。。。。 不太理解
0
大东哥
大东哥

其实我认为N+1的问题,得看具体情况。

如果N+1的实体做了缓存,反而会故意让他N+1去取数据,因为是直接从缓存中取,这样的效率会比join查询高。

这个得看具体情况,还有缓存的设计与粒度问题,我认为不能一概而论。

返回顶部
顶部