最近闲的无聊花了点时间在批量导入上面,主要是比较hibernate和jdbc

hibernate参照下面的文章

很多朋友都说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

就写到这里吧