1. 程式人生 > >OpenJPA與Hibernate實現JPA的效能…

OpenJPA與Hibernate實現JPA的效能…

專案移植到OpenJPA後一直使用都很不錯,最近看了http://www.iteye.com/topic/777470受到一些啟發,基於自己的專案也做了一下測試。

1、測試程式碼:

Java程式碼 複製程式碼 收藏程式碼
  1. long t1 = System.currentTimeMillis();   
  2. qtServ.test();   
  3. long t2 = System.currentTimeMillis();   
  4. System.out.println("總耗時:" + String.valueOf(t2 - t1));  
    long t1 = System.currentTimeMillis();
    qtServ.test();
    long t2 = System.currentTimeMillis();
    System.out.println("總耗時:" + String.valueOf(t2 - t1));
Java程式碼 複製程式碼 收藏程式碼
  1. publicvoid test() {   
  2. long t1, t2;   
  3.   t1 = System.currentTimeMillis();   
  4. for (int i = 0; i < 10000; i++) {   
  5.     TXx txx = new TXx();   
  6.     txx.setXxMc("測試名稱" + i);   
  7.     txx.setXxDm("測試程式碼" + i);   
  8.     txx.setXxLx("測試型別" + i);   
  9.     txx.setXxXh(i);   
  10.     txxDAO.save(txx);   
  11.   }   
  12.   t2 = System.currentTimeMillis();   
  13.   System.out.println("插入10000條記錄耗時:" + String.valueOf(t2 - t1));   
  14.   t1 = System.currentTimeMillis();   
  15.   List ls = txxDAO.findAll();   
  16.   t2 = System.currentTimeMillis();   
  17.   System.out.println("查詢10000條記錄耗時:" + String.valueOf(t2 - t1));   
  18.   t1 = System.currentTimeMillis();   
  19.   List ls2 = txxDAO.findAll();   
  20.   t2 = System.currentTimeMillis();   
  21.   System.out.println("重複查詢10000條記錄耗時:" + String.valueOf(t2 - t1));   
  22.   t1 = System.currentTimeMillis();   
  23. for (TXx txx : ls) {   
  24.     TXx t = txxDAO.getByID(txx.getXxId());   
  25.   }   
  26.   t2 = System.currentTimeMillis();   
  27.   System.out.println("逐個查詢10000條記錄耗時:" + String.valueOf(t2 - t1));   
  28.   t1 = System.currentTimeMillis();   
  29. for (TXx txx : ls) {   
  30.     txx.setXxMc(txx.getXxMc() + "修改後");   
  31.     txxDAO.update(txx);   
  32.   }   
  33.   t2 = System.currentTimeMillis();   
  34.   System.out.println("修改10000條記錄耗時:" + String.valueOf(t2 - t1));   
  35.   t1 = System.currentTimeMillis();   
  36. for (TXx txx : ls) {   
  37.     txxDAO.delete(txx);   
  38.   }   
  39.   t2 = System.currentTimeMillis();   
  40.   System.out.println("逐條刪除10000條記錄耗時:" + String.valueOf(t2 - t1));   
  41. }  
  public void test() {
    long t1, t2;
    t1 = System.currentTimeMillis();
    for (int i = 0; i < 10000; i++) {
      TXx txx = new TXx();
      txx.setXxMc("測試名稱" + i);
      txx.setXxDm("測試程式碼" + i);
      txx.setXxLx("測試型別" + i);
      txx.setXxXh(i);
      txxDAO.save(txx);
    }
    t2 = System.currentTimeMillis();
    System.out.println("插入10000條記錄耗時:" + String.valueOf(t2 - t1));

    t1 = System.currentTimeMillis();
    List ls = txxDAO.findAll();
    t2 = System.currentTimeMillis();
    System.out.println("查詢10000條記錄耗時:" + String.valueOf(t2 - t1));

    t1 = System.currentTimeMillis();
    List ls2 = txxDAO.findAll();
    t2 = System.currentTimeMillis();
    System.out.println("重複查詢10000條記錄耗時:" + String.valueOf(t2 - t1));

    t1 = System.currentTimeMillis();
    for (TXx txx : ls) {
      TXx t = txxDAO.getByID(txx.getXxId());
    }
    t2 = System.currentTimeMillis();
    System.out.println("逐個查詢10000條記錄耗時:" + String.valueOf(t2 - t1));

    t1 = System.currentTimeMillis();
    for (TXx txx : ls) {
      txx.setXxMc(txx.getXxMc() + "修改後");
      txxDAO.update(txx);
    }
    t2 = System.currentTimeMillis();
    System.out.println("修改10000條記錄耗時:" + String.valueOf(t2 - t1));

    t1 = System.currentTimeMillis();
    for (TXx txx : ls) {
      txxDAO.delete(txx);
    }
    t2 = System.currentTimeMillis();
    System.out.println("逐條刪除10000條記錄耗時:" + String.valueOf(t2 - t1));
  }

專案使用JPA2.0,除只是在JPA的實現中使用不同的包,其他完全相同

由於快取的配置專案不同,不太好做對比,因此本次測試只配置了基礎的JPA專案即連線地址、帳號、密碼。

專案在Eclipse中以debug模式執行

由於OpenJPA使用了增強,這裡用的是在tomcat執行時加入org.springframework.instrument-3.0.3.RELEASE.jar

測試方法,匯入專案立刻debug,待tomcat啟動完成即開始連續5次測試,將測試結果分別記錄

測試結果


OpenJPA與Hibernate實現JPA的效能測試

分析對比結果


OpenJPA與Hibernate實現JPA的效能測試


 結論:

這個也太協會了,OpenJPA的插入執行效率和Hibernate的查詢執行效率也……

個人覺得是不是我的測試構造的不完善,為什麼會有這麼大的反差,但是多少也說明了OpenJPA執行效率在2.0後有了較高的提升。在專案中開啟快取後從使用情況來看還是不錯的。當然我還是覺得這個測試不完善,請高手幫忙解惑……