爪哇一角

          共同探討STRUTS#HIBERNATE#SPRING#EJB等技術
          posts - 3, comments - 6, trackbacks - 0, articles - 99
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Hibernate性能測試(load10000條記錄的簡單測試 僅供參考)

          性能測試:
          ?? 對一個9036條記錄的表進行load測試,表字段有8個,有一個字段是text型,每條記錄的該字段約有1300多字節,其余都是簡單字段
          ?? 軟硬件:AMD XP1600+, 512M內存(測試時內存有余),winXP SP1, JDK1.4.2_06, Mysql4.1.9,InnoDB,GBK, mm.3.1.6驅動, tomcat5.0.28(啟動設置最大內存256M,最小內存64M),hibernate2.1.8, 打開二級緩存Ehcache(配置二級緩存最多10000個對象)關閉所有hibernate log信息和sql輸出
          ??
          ?? 方法1:先用 List idList = session.find("select o.id from MyClass o");找出idList然后
          ????????? list.add(session.load(MyClass.class, (Long)idList.get(i)));組成list
          ?? 方法2:直接用hibernate的session.find(from MyClass )得到list
          ?? 方法3:直接用hibernate的session.iterator(from MyClass ),然后list = new ArrayList(9100);? while(iter.hasNext()) { list.add(iter.next()); }構造list
          ??
          ?? 每個方法連續調用5次。(第1次調用是沒有二級緩存的結果,第2次以后是有二次緩存的結果)
          ??
          ?? 結果如下:??
          ???????
          ????結束第1次loadAll1()方法, 用時15763ms~14762ms
          ????結束第2次loadAll1()方法, 用時771ms~580ms
          ????結束第3次loadAll1()方法, 用時631ms~611ms
          ????結束第4次loadAll1()方法, 用時641ms~591ms
          ????結束第5次loadAll1()方法, 用時601ms~551ms
          ??
          ????結束第1次loadAll2()方法, 用時2965ms~3025ms
          ????結束第2次loadAll2()方法, 用時2854ms~2950ms?
          ????結束第3次loadAll2()方法, 用時2613ms~
          ????結束第4次loadAll2()方法, 用時2815ms~
          ????結束第5次loadAll2()方法, 用時2653ms~
          ????
          ????結束第1次loadAll3()方法, 用時16664ms~16514ms
          ????結束第2次loadAll3()方法, 用時651ms~661ms
          ????結束第3次loadAll3()方法, 用時621ms~591ms
          ????結束第4次loadAll3()方法, 用時571ms~571ms
          ????結束第5次loadAll3()方法, 用時641ms~631ms ????


          ??
          ?? 分析: 方法1和方法3在訪問數據庫的策略是一樣的,所以運行時間基本差不多。(方法3稍慢一點可能是iterator遍歷再組成list用的時間較多)這兩種方法第一次運行都要進行9036+1次數據庫訪問,所以時間最長。而第二次以后運行只需訪問一次數據庫,并只取出數據的id不取別的字段,因為此時所有對象都已經存在二級緩存中,剩下的是訪問二級緩存組成list,所以速度最快。
          ??
          ????????? 而方法2每次都會訪問數據庫load所有數據的所有字段,打開cache的log信息,可以看出第2次以后會通過二級緩存得到數據,但是由于load所有字段占用時間占了此方法較大比例的開銷,所以,即使訪問二級緩存,性能提高也非常微小,每次運行的時間花費幾乎一樣。
          ??
          ?????????

          注意事項:
          ? (1)不要在機器運行較長時間后運行tomcat進行測試,特別是機器啟動后頻繁地開啟tomcat,java程序,打開較大應用程序占用很多內存的時候。那時候測試結果一定不準。比如:我昨天晚上測試先用方法1的時間是200S,60S,后運行方法2,竟然用了8000S,200S!
          ? (2)設置log4j的LOG級別,不要hibernate和sql的信息。時間會減少很多。(log4j的配置文件難道有這個規矩:一行結尾不能有空格的說???FT!!!)
          ? (3)在tomcat啟動時進行測試,并在測試方法前調用一個會用到hibernate的方法,讓hibernate初始化先完成
          ?

          主站蜘蛛池模板: 金沙县| 景宁| 肃宁县| 宜良县| 隆子县| 新野县| 建昌县| 仪陇县| 辽阳县| 北流市| 长治市| 漠河县| 咸丰县| 本溪| 江都市| 东至县| 乌拉特后旗| 秦皇岛市| 白山市| 郯城县| 齐齐哈尔市| 昌乐县| 德惠市| 贵州省| 化州市| 东台市| 政和县| 麦盖提县| 眉山市| 西乌珠穆沁旗| 星座| 耒阳市| 体育| 界首市| 囊谦县| 扎兰屯市| 上思县| 山丹县| 平陆县| 长沙市| 织金县|