快速业务通道

Cayenne,开源ORM盛宴中的另道佳肴,第2部分 - Apache Cayenne的高级特性 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
代码中通过执行 context.performQuery("MyQueryForCache",false)即可以从缓存中获得数据,执行 context.performQuery("MyQueryForCache",true)则可以执行缓存刷新操作。

图 6. 在 Cayenne Modeler 中配置缓存

Cayenne 中的数据分页查询和数据预读

数据分页查询和数据预读是数据库应用程序系统性能优化的两种常用技术。当使用数据预读技术时,应用程序能够在一次查询操作中获取多个相关联的数据项,从而能够减少数据库访问次数。当使用数据分页查询技术时,应用程序能够分批次(分页)获取一个包含大量数据的结果集中的少量数据,从而可以减少单次数据库查询所需的时间。当查询结果是一个大型的结果集,但是只有其中的一小部分是所需数据时,使用数据分页查询可以极大的提高应用程序的数据库访问性能。Cayenne 对这两种技术均提供了良好的支持,并且使用这些技术的代码也非常的简洁。本文的最后部分简要介绍这两种技术在 Cayenne 中的应用。

数据预读 (Prefetching):Cayenne 可以在一个 SelectQuery 上设定附加的 Prefetch 参数,该参数可以将待查询的数据对象中的关系属性传递到 SelectQuery 中,从而可以在单次 performQuery 操作中查询到多个数据对象关系链中的数据对象,使用数据预读可以减少大量的 SQL 查询操作。清单 9 是一个使用数据预读的示例代码片断,该示例中的数据对象 ClientTB 中具有一个名为 orders的 to many 类型的关系。SelectQuery 对象的 addPrefetch("orders") 方法设定了针对关系 orders 的数据预读。当 context.performQuery 方法执行时,Cayenne 执行数据预读操作,在同一个查询中执行针对 ClientTB 和 orders 关系中关联对象的查询,并将 orders 关系中关联对象储存在 ClientTB 的 orders 属性中 ( 可以通过 getOrders()) 方法访问。

清单 9. 使用数据预读

DataContext context = DataContext.createDataContext();   SelectQuery clientTBSelectQuery = new SelectQuery(ClientTB.class);   // 设定针对关系 orders 的数据预读   clientTBSelectQuery.addPrefetch("orders");   List clientTBDataList = context.performQuery(clientTBSelectQuery);   Iterator it = clientTBDataList.iterator();   while (it.hasNext()) {   ClientTB a = (ClientTB) it.next();   // 数据预读后查询到的 orders 对象被放置在ClientTB的orders属性中,通过getOrders()方法访问   System.out.println("orders: " + a.getOrders().size());   }

数据分页查询 (Paginated Queries):在 Cayanne 中当启动了数据分页查询功能后,在代码中需要为 SelectQuery 设定一个 Page Size值,每次数据库访问时 Cayanne 只会获取 Page Size 指定行数的结果集数据,同时只读取其余数据行的主键值。当查询一个没有被获取过的数据项时,包含该数据项的整个 page 的所有数据项都会立刻被获取。这些数据库访问操作 Cayenne 会在后台自动透明的执行,不需要用户代码参与。清单 10 是一个使用数据分页查询的示例代码片断,假设该查询结果集中包含超过 200 条的数据项,Page Size 设定为 50, 当 context.performQuery 运行时,第一页的 第 1到第 50条数据被从数据库中获取,运行 clientTBRows.get(3) 时,使用已经得到的 page 中的第 3 条数据,不再访问后端数据库。当执行 clientTBRows.get(153) 操作时,第四页的第 151到第 200条数据被从数据库中获取。

清单 10. 使用数据分页查询

DataContext context = DataContext.createDataContext();   SelectQuery clientTBSelectQuery = new SelectQuery(ClientTB.class);   // 设定 Page 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号