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ù)進行了插入和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查詢做分頁處理,因為NQ并沒有把查詢結(jié)果的所有數(shù)據(jù)加載到內(nèi)存中,查詢前后,內(nèi)存都是沒有變化的。

          主站蜘蛛池模板: 长沙县| 辽宁省| 仪陇县| 乌恰县| 琼结县| 济宁市| 宜州市| 武定县| 南丰县| 武胜县| 郁南县| 九寨沟县| 乌审旗| 东安县| 牙克石市| 云霄县| 盈江县| 察雅县| 澄城县| 湛江市| 宜春市| 建宁县| 东阳市| 南阳市| 梧州市| 泉州市| 乌兰浩特市| 合山市| 宁国市| 高雄县| 邵阳市| 汤原县| 牟定县| 明光市| 当雄县| 西盟| 桂林市| 海原县| 静安区| 枣阳市| 镇坪县|