最近闲的无聊花了点时间在批量导入上面,主要是比较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