Db4o查询测试

在使用Db4o时做分页时,做了个测试。分别对1000条、10000条、100000、300000条数据进行了插入和NQ、QBE查询测试。
public   class  Test  {
    
final static String DB4OFILENAME = "formula1.db";
     
public static void main(String[] args) {
         ObjectContainer db
=Db4oEmbedded.openFile(Db4oEmbedded
                    .newConfiguration(), DB4OFILENAME);
         
try {
             storePilots(db);
             retrieveComplexNQ(db);
         }

         
catch(Exception e){
             e.printStackTrace();
         }

         
finally {
                db.close();
            }

     }

     
     
public static void storePilots(ObjectContainer db) {
             
long time = System.currentTimeMillis();
            System.out.println(
"插入100000条数据前内存:" + Runtime.getRuntime().totalMemory());
            
for(int i = 0; i < 100000; i++){
                db.store(
new Pilot("Michael Schumacher",100));
            }

            System.out.println(
"插入100000条数据后内存:" + Runtime.getRuntime().totalMemory() 
                    
+ " 时间" + (System.currentTimeMillis() - time));
        }

     
     
public static void retrieveComplexNQ(ObjectContainer db) {
         
long time = System.currentTimeMillis();
        System.out.println(
"NQ查询前内存:" + Runtime.getRuntime().totalMemory());
        
///NQ方式不会把查询到的数据加载到内存,分页的话,可以用这个先查询出结果集
        List<Pilot> result=db.query(new Predicate<Pilot>() {
            
public boolean match(Pilot pilot) {
                
return true;
            }

        }
);
        System.out.println(
"NQ查询后内存:" + Runtime.getRuntime().totalMemory()
                
+ " 时间" + (System.currentTimeMillis() - time));
        time 
= System.currentTimeMillis();
        System.out.println(
"QBE查询前内存:" + Runtime.getRuntime().totalMemory());
        ObjectSet result1
=db.queryByExample(Pilot.class);
        System.out.println(
"QBE查询后内存:" + Runtime.getRuntime().totalMemory()
               
+ " 时间" + (System.currentTimeMillis() - time));
   }

}

public   class  Pilot  {    
    
private String name;
    
private int points;  
    
    
public Pilot(String name,int points) {
        
this.name=name;
        
this.points=points;
    }

        
    
public int getPoints() {
        
return points;
    }

    
    
public void addPoints(int points) {
        
this.points+=points;
    }

    
    
public String getName() {
        
return name;
    }

    
    
public String toString() {
        
return name+"/"+points;
    }

}

//////1000条数据的测试结果
插入1000条数据前内存:5177344
插入1000条数据后内存:5177344 时间219
NQ查询前内存:5177344
NQ查询后内存:5177344 时间546
QBE查询前内存:5177344
QBE查询后内存:5177344 时间32

//////10000条数据的测试结果
插入10000条数据前内存:5177344
插入10000条数据后内存:5177344 时间625
NQ查询前内存:5177344
NQ查询后内存:5177344 时间344
QBE查询前内存:5177344
QBE查询后内存:5177344 时间47

//////100000条数据的测试结果
插入100000条数据前内存:5177344
插入100000条数据后内存:15978496 时间4743
NQ查询前内存:15978496
NQ查询后内存:15978496 时间297
QBE查询前内存:15978496
QBE查询后内存:22306816 时间312

//////300000条数据的测试结果
插入100000条数据前内存:5177344
插入100000条数据后内存:55123968 时间14040
NQ查询前内存:55123968
NQ查询后内存:55123968 时间313
QBE查询前内存:55123968
QBE查询后内存:66650112 时间748

结论,在数据量少时,使用QBE查询比NQ查询要快。可以使用NQ查询做分页处理,因为NQ并没有把查询结果的所有数据加载到内存中,查询前后,内存都是没有变化的。

你可能感兴趣的:(Db4o查询测试)