posts - 59, comments - 244, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Db4o查詢測試

          Posted on 2010-10-21 00:24 penngo 閱讀(1906) 評論(0)  編輯  收藏 所屬分類: Java
          在使用Db4o時做分頁時,做了個測試。分別對1000條、10000條、100000、300000條數(shù)據(jù)進(jìn)行了插入和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條數(shù)據(jù)前內(nèi)存:" + Runtime.getRuntime().totalMemory());
                      
          for(int i = 0; i < 100000; i++){
                          db.store(
          new Pilot("Michael Schumacher",100));
                      }

                      System.out.println(
          "插入100000條數(shù)據(jù)后內(nèi)存:" + Runtime.getRuntime().totalMemory() 
                              
          + " 時間" + (System.currentTimeMillis() - time));
                  }

               
               
          public static void retrieveComplexNQ(ObjectContainer db) {
                   
          long time = System.currentTimeMillis();
                  System.out.println(
          "NQ查詢前內(nèi)存:" + Runtime.getRuntime().totalMemory());
                  
          ///NQ方式不會把查詢到的數(shù)據(jù)加載到內(nèi)存,分頁的話,可以用這個先查詢出結(jié)果集
                  List<Pilot> result=db.query(new Predicate<Pilot>() {
                      
          public boolean match(Pilot pilot) {
                          
          return true;
                      }

                  }
          );
                  System.out.println(
          "NQ查詢后內(nèi)存:" + Runtime.getRuntime().totalMemory()
                          
          + " 時間" + (System.currentTimeMillis() - time));
                  time 
          = System.currentTimeMillis();
                  System.out.println(
          "QBE查詢前內(nèi)存:" + Runtime.getRuntime().totalMemory());
                  ObjectSet result1
          =db.queryByExample(Pilot.class);
                  System.out.println(
          "QBE查詢后內(nèi)存:" + 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條數(shù)據(jù)的測試結(jié)果
          插入1000條數(shù)據(jù)前內(nèi)存:5177344
          插入1000條數(shù)據(jù)后內(nèi)存:5177344 時間219
          NQ查詢前內(nèi)存:5177344
          NQ查詢后內(nèi)存:5177344 時間546
          QBE查詢前內(nèi)存:5177344
          QBE查詢后內(nèi)存:5177344 時間32

          //////10000條數(shù)據(jù)的測試結(jié)果
          插入10000條數(shù)據(jù)前內(nèi)存:5177344
          插入10000條數(shù)據(jù)后內(nèi)存:5177344 時間625
          NQ查詢前內(nèi)存:5177344
          NQ查詢后內(nèi)存:5177344 時間344
          QBE查詢前內(nèi)存:5177344
          QBE查詢后內(nèi)存:5177344 時間47

          //////100000條數(shù)據(jù)的測試結(jié)果
          插入100000條數(shù)據(jù)前內(nèi)存:5177344
          插入100000條數(shù)據(jù)后內(nèi)存:15978496 時間4743
          NQ查詢前內(nèi)存:15978496
          NQ查詢后內(nèi)存:15978496 時間297
          QBE查詢前內(nèi)存:15978496
          QBE查詢后內(nèi)存:22306816 時間312

          //////300000條數(shù)據(jù)的測試結(jié)果
          插入100000條數(shù)據(jù)前內(nèi)存:5177344
          插入100000條數(shù)據(jù)后內(nèi)存:55123968 時間14040
          NQ查詢前內(nèi)存:55123968
          NQ查詢后內(nèi)存:55123968 時間313
          QBE查詢前內(nèi)存:55123968
          QBE查詢后內(nèi)存:66650112 時間748

          結(jié)論,在數(shù)據(jù)量少時,使用QBE查詢比NQ查詢要快。可以使用NQ查詢做分頁處理,因?yàn)镹Q并沒有把查詢結(jié)果的所有數(shù)據(jù)加載到內(nèi)存中,查詢前后,內(nèi)存都是沒有變化的。

          主站蜘蛛池模板: 泸定县| 额尔古纳市| 嘉荫县| 公安县| 新龙县| 光山县| 木里| 靖江市| 县级市| 韶关市| 加查县| 玉门市| 石河子市| 呼伦贝尔市| 池州市| 绥中县| 建湖县| 寿阳县| 汾阳市| 民勤县| 桃园市| 乐昌市| 浦江县| 辽阳县| 本溪| 当阳市| 宁德市| 喀什市| 蕲春县| 会宁县| 蒙山县| 通道| 汨罗市| 莫力| 阿城市| 常宁市| 江孜县| 布尔津县| 上犹县| 灵宝市| 巴南区|