爪哇一角

          共同探討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初始化先完成
          ?

          主站蜘蛛池模板: 南陵县| 外汇| 寻乌县| 类乌齐县| 卫辉市| 白银市| 内黄县| 泾阳县| 涡阳县| 古田县| 陆丰市| 临桂县| 济源市| 汶上县| 龙海市| 普宁市| 汝州市| 义乌市| 正蓝旗| 巴楚县| 英山县| 广西| 麟游县| 苏尼特左旗| 遂溪县| 巴林右旗| 和硕县| 花垣县| 沙河市| 阜南县| 新兴县| 图木舒克市| 大悟县| 巴中市| 韩城市| 玉门市| 丰原市| 比如县| 赞皇县| 商都县| 九台市|