开源面向对象数据库 db4o 之旅,第 2 部分: db4o 查询方式
2010-04-01 00:00:00 来源:WEB开发网必须指出 NQ 的一个的问题是:在内部,db4o 设法把 NQ 转换成 SODA。但并不是所有的查询表达式都可以成功转换。有些查询表达式的流向图(flowgraph)非常难于分析。这种情况下,db4o 将不得不实例化一些持久对象来真实地运行 NQ 表达式。
正在开发中的 NQ 查询优化器就可以化解这个障碍,它将分析 NQ 表达式的每个部分,以确保最少量的实例化对象,以此提高性能。当然,优化器的不是灵丹妙药,关键还需要自己多优化代码。
开发 Java EE 项目经常会用到分页,怎样用 NQ 实现呢?向数据库写入六条记录。清单7:
清单7
package com;
import java.util.List;
import bo.AutoInfo;
import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.query.Predicate;
public class DB4OTest{
public static void main(String[] args){
//打开数据库
ObjectContainer db = Db4o.openFile("auto.yap");
try{
List<AutoInfo> list = db.query(new Predicate<AutoInfo>() {
public boolean match(AutoInfo ai) {
return true;
}
});
//记录总数
Integer count = list.size();
//每页两条,分三页
for(int x = 0; x < 3; x++){
System.out.println("第"+x+"页:"+list.get(x*2).getLicensePlate());
System.out.println("第"+x+"页:"+list.get(x*2+1).getLicensePlate());
}
}finally{
//关闭连接
db.close();
}
}
}
我们发现,在进行 NQ 查询时并没有加入任何条件(无条件返回 true),是不是相当于遍历了整个数据库?db4o 的设计者早就想到了这个问题,当 db.query() 执行完毕返回 list 实例的时候,db4o 只是与数据库同步取出内部 IDs 而已,并没有把所有的 AutoInfo 对象全部取出,只有在 list.get(x*2).getLicensePlate() 之后才会去根据 IDs 取出记录。所以不必担心性能问题。
结论
db4o 为开发者提供了多种查询方式,这些方式都很灵活。要引起大家注意的是:灵活在带来便利的同时也对开发者自身素质提出了更高的要求,(比如排序,既可以用 SODA 也可以用 Java 集合对象实现)在开发过程中一定要形成某种统一的开发模式,这样 db4o 才能最高效能地为我所用。
- ››开源平台Meego和Android之间的对弈
- ››开源的Kingthy.Mail邮件组件库
- ››面向对象的JavaScript (一、对象基础,使用函数来...
- ››开源飞信Openfetion最新发布v1.8版
- ››开源重复数据删除技术纵览
- ››面向对象数据库 db4o 之旅,第 4 部分: 使用 dRS
- ››开源的 iPhone 杀手终于到来
- ››开源有优势:Android首超Windows Mobile
- ››对象存储不给高性能计算添堵
- ››面向 Java Web 应用程序的 OpenID,第 2 部分: 为...
- ››开源只不过是个幌子 揭示 Android 的真面目
- ››开源面向对象数据库 db4o 之旅,第 1 部分: 初识 ...
更多精彩
赞助商链接