最近閒的無聊花了點時間在批量導入上面,主要是比較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