Hibernate批量處理的性能優化問題

          Posted on 2006-12-27 11:16 weibogao 閱讀(5132) 評論(0)  編輯  收藏 所屬分類: software development


          Hibernate批量處理:

          Hibernate批量處理其實從性能上考慮,它是很不可取的,浪費了很大的內存。從它的機制上講,Hibernate它是先把符合條件的數據查出來,放到內存當中,然后再進行操作。實際使用下來性能非常不理想,在筆者的實際
          使用中采用下面的第三種優化方案的數據是:100000條數據插入數據庫,主流臺式機的配置,需要約30分鐘,呵呵,暈倒.

          總結下來有三種來處理以解決性能問題:

          1:繞過Hibernate API ,直接通過 JDBC API 來做,這個方法性能上是比較好的。也是最快的.

          2:運用存儲過程。

          3:還是用Hibernate API 來進行常規的批量處理,可以也有變,變就變在,我們可以在查找出一定的量的時候,及時的將這些數據做完操作就

          刪掉,session.flush();session.evict(XX對象集); 這樣也可以挽救一點性能損失。這個“一定的量”要就要根據實際情況做定量參考了。一般為30-60左右,但效果仍然不理想.

          ?

          ?

          1:繞過Hibernate API ,直接通過 JDBC API 來做,這個方法性能上是比較好的,也是最快的。(實例為 更新操作)

          ?

          Transaction tx=session.beginTransaction(); //注意用的是hibernate事務處理邊界

          Connection conn=session.connection();

          PreparedStatement stmt=conn.preparedStatement("update CUSTOMER as C set C.sarlary=c.sarlary+1 where c.sarlary>1000");

          stmt.excuteUpdate();

          tx.commit(); //注意用的是hibernate事務處理邊界

          這小程序中,采用的是直接調用JDBC 的API 來訪問數據庫,效率很高。避免了Hibernate 先查詢出來加載到內存,再進行操作引發的性能問題

          。

          2:運用存儲過程。但這種方式考慮到易植和程序部署的方便性,不建議使用.(實例為 更新操作)

          如果底層數據庫(如Oracle)支持存儲過程,也可以通過存儲過程來執行批量更新。存儲過程直接在數據庫中運行,速度更加快。在Oracle數

          據庫中可以定義一個名為batchUpdateCustomer()的存儲過程,代碼如下:


          代碼內容
          create or replace procedure batchUpdateCustomer(p_age in number) as
          begin
          update CUSTOMERS set AGE=AGE+1 where AGE>p_age;
          end;?


          以上存儲過程有一個參數p_age,代表客戶的年齡,應用程序可按照以下方式調用存儲過程:

          代碼內容
          tx = session.beginTransaction();
          Connection con=session.connection();
          String procedure = "{call batchUpdateCustomer(?) }";
          CallableStatement cstmt = con.prepareCall(procedure);
          cstmt.setInt(1,0); //把年齡參數設為0
          cstmt.executeUpdate();
          tx.commit();?


          從上面程序看出,應用程序也必須繞過Hibernate API,直接通過JDBC API來調用存儲過程。

          3:還是用Hibernate API 來進行常規的批量處理,可以也有變,變就變在,我們可以在查找出一定的量的時候,及時的將這些數據做完操作就

          刪掉,session.flush();session.evict(XX對象集); 這樣也可以挽救一點性能損失。這個“一定的量”要就要根據實際情況做定量參考了。。

          (實例為 保存操作)

          業務邏輯為:我們要想數據庫插入10 0000 條數據

          tx=session.beginTransaction();

          for(int i=0;i<100000;i++)

          {

          Customer custom=new Customer();

          custom.setName("user"+i);

          session.save(custom);

          if(i%50==0) // 以每50個數據作為一個處理單元,也就是我上面說的“一定的量”,這個量是要酌情考慮的

          {

          session.flush();

          session.clear();

          }

          }

          這樣可以把系統維持在一個穩定的范圍....

          posts - 41, comments - 7, trackbacks - 0, articles - 0

          Copyright © weibogao

          主站蜘蛛池模板: 翁牛特旗| 新河县| 油尖旺区| 东方市| 大邑县| 左云县| 清远市| 中阳县| 商河县| 卢氏县| 松潘县| 延吉市| 舞钢市| 噶尔县| 临桂县| 富顺县| 南靖县| 清流县| 南投县| 玛多县| 安多县| 比如县| 勃利县| 沙湾县| 浪卡子县| 南康市| 同仁县| 沁阳市| 藁城市| 儋州市| 新竹县| 松阳县| 绥江县| 三门峡市| 综艺| 池州市| 安丘市| 烟台市| 台州市| 蒙山县| 腾冲县|