hibernate批量導入性能問題

最近閒的無聊花了點時間在批量導入上面,主要是比較hibernate和jdbchtml

hibernate參照下面的文章sql

不少朋友都說hibernate的效率很低,其實否則,相對jdbc來講hibernate的效率確定不是最好的,因爲hibernate的底層也是整合jdbc進行數據操做的,較單純的jdbc處理數據效率確定要低一點,由於它還有不少額外的工做要作
                                                    
可是對於通常的請求我的感受hibernate仍是不錯的。
1.開始的時候我使用的是hibernateDaoSupport.getHibernateTemplate().sava(Object)這個方法實現數據的插入,效率低得嚇人。
2.而後我改用了hibernate的批量導入
Session session = getHibernateTemplate().getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
                                                           
        try{
            for(int i=0;i<list.size();i++){
                session.save((YPrice)list.get(i));
                                                                   
                if(i%50==0){//起初沒有這段,list裏一共存放10000條數據,開始我一次性所有放進session中,這樣比較吃內存,hibernate的緩存佔用較多,不能及時釋放,致使效率下降,沒有出現內存溢出還算是萬幸
                    session.flush();
                    session.clear();
                }
            }
                                                               
            tx.commit();
        }catch(HibernateException   e){
            tx.rollback();
            e.printStackTrace();
        }finally{
            session.close();
        }
                                                    
效率有所改觀,35萬數據用了大概40分鐘(開始導入的數據都是幾萬條,沒以爲效率有多大問題,數據量開始打起來的時候才發覺效率是個很可怕的東西)
3.到這裏遇到的瓶頸,不知道該怎麼辦去提升效率了,有想過使用jdbc,可是直覺告訴我hibernate的效率即便低也不該該低到這個地步,因而上網找了不少資料,嘗試過改動每次存入session中的數據,1000改動50後效率有必定改善,也嘗試過改動鏈接池的最大和最小鏈接數,這個效果不明顯,最後發現最大的問題出在hibernate配置中的hibernate.jdbc.batch_size(每次提交SQL的數量)這個參數,若是不配置的話默認每次提交一條sql,其效率可想而知。
<property name="hibernateProperties">
            <props>
                <!-- prop key="hibernate.dialect">
                    org.hibernate.dialect.DB2Dialect
                    org.hibernate.dialect.MySQLDialect
                </prop -->
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.DB2Dialect
                </prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.jdbc.batch_size">50</prop>//這一段
            </props>
        </property>
                                                    
總結:通常性應用我的感受使用hibernate徹底能夠知足咱們的需求,jdbc效率當然高,可是對於咱們來講編碼起來或許不方便,至於使用哪一個要根據本身的實際去選擇了。我最終的效率是這樣的35萬條數據123秒。

我本身學了一下批量導入:用jdbc加上數據庫存儲過程使得效率提升了一大截。數據庫

有一個問題是:批量導入的時候須要判斷是否已經存在這一條數據,那麼怎麼辦呢?緩存

網上有人說先插進去,而後再判重,數據庫判重參考http://blog.csdn.net/linda1000/article/details/12167781 session

就寫到這裏吧ide

相關文章
相關標籤/搜索