java批量导入性能,hibernate批量导入性能问题

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

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,其效率可想而知。

org.hibernate.dialect.DB2Dialect

true

50//这一段

总结:一般性应用个人感觉使用hibernate完全可以满足我们的需求,jdbc效率固然高,但是对于我们来说编码起来或许不方便,至于使用哪个要根据自己的实际去选择了。我最终的效率是这样的35万条数据123秒。

我自己学了一下批量导入:用jdbc加上数据库存储过程使得效率提高了一大截。

有一个问题是:批量导入的时候需要判断是否已经存在这一条数据,那么怎么办呢?

就写到这里吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值