WEB开发网
开发学院软件开发Java 开源面向对象数据库 db4o 之旅,第 2 部分: db4o ... 阅读

开源面向对象数据库 db4o 之旅,第 2 部分: db4o 查询方式

 2010-04-01 00:00:00 来源:WEB开发网   
核心提示: 必须指出 NQ 的一个的问题是:在内部,db4o 设法把 NQ 转换成 SODA,开源面向对象数据库 db4o 之旅,第 2 部分: db4o 查询方式(9),但并不是所有的查询表达式都可以成功转换,有些查询表达式的流向图(flowgraph)非常难于分析,(比如排序,既可以用 SODA 也可以

必须指出 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 才能最高效能地为我所用。

上一页  4 5 6 7 8 9 

Tags:开源 面向 对象

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接