<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    爪哇一角

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

    Hibernate下數據批量處理解決方案(轉)

    Posted on 2006-09-20 09:56 非洲小白臉 閱讀(348) 評論(0)  編輯  收藏 所屬分類: hibernate

    Hibernate下數據批量處理解決方案

    很多人都對Java在批量數據的處理方面是否是其合適的場所持有懷疑的念頭,由此延伸,那么就會認為ORM可能也不是特別適合數據的批量處理。 其實,我想如果我們應用得當的話,完全可以消除ORM批量處理性能問題這方面的顧慮。下面以Hibernate為例來做為說明,假如我們真的不得不在Java中使用Hibernate來對數據進行批量處理的話。 向數據庫插入100 000條數據,用Hibernate可能像這樣:

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer); }
    tx.commit();
    session.close();

      大概在運行到第50 000條的時候,就會出現內存溢出而失敗。這是Hibernate把最近插入的Customer都以session-level cache在內存做緩存,我們不要忘記Hiberante并沒有限制first-level cache 的緩存大小:

      # 持久對象實例被管理在事務結束時,此時Hibernate與數據庫同步任何已經發生變 化的被管理的的對象。

      # Session實現了異步write-behind,它允許Hibernate顯式地寫操作的批處理。 這里,我給出Hibernate如何實現批量插入的方法:
    首先,我們設置一個合理的JDBC批處理大小,hibernate.jdbc.batch_size 20。 然后在一定間隔對Session進行flush()和clear()。

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) {
    //flush 插入數據和釋放內存:
    session.flush(); session.clear(); }
    }
    tx.commit();
    session.close();

      那么,關于怎樣刪除和更新數據呢?那好,在Hibernate2.1.6或者更后版本,scroll() 這個方法將是最好的途徑:

    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    ScrollableResults customers = session.getNamedQuery("GetCustomers")
    .scroll(ScrollMode.FORWARD_ONLY);
    int count=0;
    while ( customers.next() ) {
    Customer customer = (Customer) customers.get(0);
    customer.updateStuff(...);
    if ( ++count % 20 == 0 ) {
    //flush 更新數據和釋放內存:
    session.flush(); session.clear(); } }
    tx.commit(); session.close();

      這種做法并不困難,也不算不優雅。請注意,如果Customer啟用了second-level caching ,我們仍然會有一些內存管理的問題。原因就是對于用戶的每一次插入和更新,Hibernate在事務處理結束后不得不通告second-level cache 。因此,我們在批處理情況下將要禁用用戶使用緩存。

    主站蜘蛛池模板: 国产亚洲精品成人AA片| 亚洲国产精品线观看不卡| 国产亚洲午夜精品| 精品剧情v国产在免费线观看 | 精品久久久久久亚洲精品| 午夜免费1000部| 亚洲国产日韩在线| 性生交片免费无码看人| 亚洲愉拍一区二区三区| 毛片免费观看的视频| 欧美亚洲精品一区二区| 国产大片线上免费看| 猫咪免费人成网站在线观看入口| 免费人成年激情视频在线观看| 全黄A免费一级毛片| 亚洲无线码在线一区观看| 99久久免费观看| 亚洲精品av无码喷奶水糖心| 日本二区免费一片黄2019| 一级特黄aaa大片免费看| 亚洲国产精品高清久久久| www视频在线观看免费| 久久久久亚洲精品无码网址色欲 | 男男黄GAY片免费网站WWW| 久久久无码精品亚洲日韩软件| a级特黄毛片免费观看| 亚洲天堂一区二区三区| 国产一级淫片免费播放| 叮咚影视在线观看免费完整版| 亚洲日韩乱码中文无码蜜桃| 日韩免费电影在线观看| 国产精品免费观看视频| 亚洲人成免费电影| 成人亚洲网站www在线观看| 久久久国产精品福利免费| 中文字幕亚洲码在线| 国产a v无码专区亚洲av| 亚洲成人在线免费观看| 一边摸一边桶一边脱免费视频| 亚洲黄色片免费看| 久久精品国产精品亚洲艾草网美妙|