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

相关文章
相关标签/搜索