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

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

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

    我的空間,寫(xiě)我所寫(xiě),禪我所藏

    與我一起遨游吧

     

    Hibernate下數(shù)據(jù)批量處理解決方案

    很多人都對(duì)java在批量數(shù)據(jù)的處理方面是否是其合適的場(chǎng)所持有懷疑的念頭,由此延伸,那么就會(huì)認(rèn)為orm可能也不是特別適合數(shù)據(jù)的批量處理。 其實(shí),我想如果我們應(yīng)用得當(dāng)?shù)脑挘耆梢韵齩rm批量處理性能問(wèn)題這方面的顧慮。下面以hibernate為例來(lái)做為說(shuō)明,假如我們真的不得不在java中使用hibernate來(lái)對(duì)數(shù)據(jù)進(jìn)行批量處理的話。 向數(shù)據(jù)庫(kù)插入100 000條數(shù)據(jù),用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();

      大概在運(yùn)行到第50 000條的時(shí)候,就會(huì)出現(xiàn)內(nèi)存溢出而失敗。這是hibernate把最近插入的customer都以session-level cache在內(nèi)存做緩存,我們不要忘記hiberante并沒(méi)有限制first-level cache 的緩存大小:

      # 持久對(duì)象實(shí)例被管理在事務(wù)結(jié)束時(shí),此時(shí)hibernate與數(shù)據(jù)庫(kù)同步任何已經(jīng)發(fā)生變 化的被管理的的對(duì)象。

      # session實(shí)現(xiàn)了異步write-behind,它允許hibernate顯式地寫(xiě)操作的批處理。 這里,我給出hibernate如何實(shí)現(xiàn)批量插入的方法:
    首先,我們?cè)O(shè)置一個(gè)合理的jdbc批處理大小,hibernate.jdbc.batch_size 20。 然后在一定間隔對(duì)session進(jìn)行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 插入數(shù)據(jù)和釋放內(nèi)存:
    session.flush(); session.clear(); }
    }
    tx.commit();
    session.close();

      那么,關(guān)于怎樣刪除和更新數(shù)據(jù)呢?那好,在hibernate2.1.6或者更后版本,scroll() 這個(gè)方法將是最好的途徑:

    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 更新數(shù)據(jù)和釋放內(nèi)存:
    session.flush(); session.clear(); } }
    tx.commit(); session.close();

      這種做法并不困難,也不算不優(yōu)雅。請(qǐng)注意,如果customer啟用了second-level caching ,我們?nèi)匀粫?huì)有一些內(nèi)存管理的問(wèn)題。原因就是對(duì)于用戶的每一次插入和更新,hibernate在事務(wù)處理結(jié)束后不得不通告second-level cache 。因此,我們?cè)谂幚砬闆r下將要禁用用戶使用緩存。

    posted on 2007-06-27 14:53 imcb 閱讀(278) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 国产人成亚洲第一网站在线播放| 永久黄色免费网站| 国产精品亚洲片在线va| 久久99国产综合精品免费| 久久国产亚洲电影天堂| 四虎国产精品永久免费网址| 好猛好深好爽好硬免费视频| 无遮免费网站在线入口| 国产亚洲精品AA片在线观看不加载| 亚洲中文无码卡通动漫野外| 麻豆国产人免费人成免费视频| 亚洲无线码一区二区三区| 亚洲国产视频久久| 免费黄色app网站| 国产精品亚洲а∨无码播放不卡| 性无码免费一区二区三区在线| 国产A在亚洲线播放| 伊人久久免费视频| 亚洲国产视频久久| 免费A级毛片无码视频| 亚洲va成无码人在线观看| 国产精品久久免费视频| 成人av片无码免费天天看| 日韩在线天堂免费观看| 亚洲不卡视频在线观看| 日韩免费视频在线观看| 最近更新免费中文字幕大全| 国产一级高清免费观看| 亚洲精品9999久久久久无码| 亚洲AV伊人久久青青草原| 在线毛片片免费观看| 亚洲欧洲精品成人久久曰影片 | 国内精品久久久久影院亚洲| 国产jizzjizz视频免费看| 亚洲精品黄色视频在线观看免费资源| 成人人观看的免费毛片| 黄色视频在线免费观看| 亚洲伊人久久大香线焦| 亚洲国产精品日韩专区AV| 69免费视频大片| 一级特黄色毛片免费看|