<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 。因此,我們在批處理情況下將要禁用用戶使用緩存。

    主站蜘蛛池模板: 久久久青草青青亚洲国产免观| 免费中文熟妇在线影片| 亚洲AV无码乱码在线观看| 99久久国产亚洲综合精品| 最近最好的中文字幕2019免费| 亚洲av一本岛在线播放| 免费看美女裸露无档网站| tom影院亚洲国产一区二区| 男人的好看免费观看在线视频| 亚洲AV综合色区无码二区爱AV| 免费人成网站在线观看10分钟| 亚洲天堂中文字幕在线观看| 免费下载成人电影| 亚洲av无码专区青青草原| 国产一区二区三区在线免费观看| 视频一区二区三区免费观看| 久久影视综合亚洲| 日韩电影免费在线观看中文字幕| 亚洲黄色中文字幕| 免费无码又爽又刺激聊天APP| 亚洲国产成人无码AV在线影院| 亚洲国产黄在线观看| 国产免费无码一区二区| 亚洲日韩乱码中文无码蜜桃 | 久久99热精品免费观看牛牛| 亚洲综合国产精品| 最新猫咪www免费人成| 美女免费精品高清毛片在线视| 亚洲精品无码久久久久sm| 91免费播放人人爽人人快乐| 亚洲国产精品美女久久久久| 77777亚洲午夜久久多人| 亚洲香蕉免费有线视频| 国产亚洲精品欧洲在线观看| 亚洲精品国产精品乱码不卡√| 亚洲人成在线免费观看| 无码精品人妻一区二区三区免费| 亚洲精品国产精品乱码在线观看| 一个人看www在线高清免费看| 成人免费网站视频www| 亚洲成人免费电影|