hibernate ,JDBC插入大量数据优化问题

基于struts2+spring+hibernate框架下的java WEB项目,使用hibernate进行插入大量数据超时的问题

由于业务逻辑需要,需要一次性向数据库插入3百万条数据,时间太长客户无法接受。请问有什么办法能提高插入数据的效率?

保存实现方法:
public void saveAll(Collection entities) {
log.info("saving " + this.eneity + " instance");
try {
getHibernateTemplate().saveOrUpdateAll(entities);
log.info("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
数据库:Oracle

三百万条数据正常插入数据库需要多少时间?要提高效率该怎么优化?有什么方案?

最快能能到优化到多少分钟以内,十分钟内是否有可能?

可以先把数据处理成一个文件,然后使用缓存或者定时跑批,在客户提示的时候友好一些

300万数据,不要用hibernate,而是直插
优化措施参考:http://blog.csdn.net/Eason_oracle/article/details/51537310

先将需要保存的数据放在内存中,如ehcache(这个是简单点的有风险)或者Redis缓存(速度快可靠)或者使用消息队列,然后开异步线程把临时
存放的数据再持久化。

首先hibernate都知道大量数据插入,更新这个就是它的弊端,因为它是全自动数据库持久框架,采用预编译hql语句执行sql,其执行效率就降低了,相对
于,mybaties就不一样了,sql语句自己编写,容易修改,直接使用sql对数据库操作!如果你实在要优化,尽量不要查询用*,不要用group by

需求跟我的项目差不多,生成上百万条数据或者更新上百万条数据,首先得明白为什么用hibernate这么慢,因为hibernate的各种save或者update方法的原理都是把对象的属性和值一个个拼接到一条insert或者update语句中去,如果有一百个对象,那么就拼接一百条insert语句,而且注意:是对象的全部属性,不管你有没有赋值或更改,关键就在于数据库执行一条insert/update语句是会产生固定耗时的,包含了预编译、获取锁、释放锁等等操作,可想而知得有多慢。
因此,解决这个问题的方法就是一次批量操作只有一条inset语句,而values不限,我的架构方案就是在大批量操作的时候不使用hibernate的自带方法,而是自己拼接sql语句,并最终交给存储过程去执行。
最终效果是:某个接口一次插三百万条数据原来需要30分钟,而且是越多越慢,指数增长,甚至造成事务超时。改造优化后减少至8分钟,且耗时增长与数据量的关系为_0*n_,即正常的等比例增长。
方案思想就是这样,欢迎详细交流!

使用多线程,尽量抛出异常。

用这个方法最快:在中间层服务器安装oracle客户端,使用oracle工具sql loader导入。
大致思路:
点保存按钮,生成数据文件到中间层服务器,如果说源数据本身就是文件那都不用生成了直接上传,然后中间层服务器执行sql loader命令导入文件到数据库表。

表数据插入与很多种因素有关系,抛却系统因素外,该表的有许多索引的话也会影响插入的速度,所以没有人告诉你300万数据正常时间是多少。有的话也是别人的环境。
你这样很慢是因为你的程序是单条插入的,再快也快不到哪里,优化的办法是批量插入。jdbc里有fetchsize可以批量插入,代码简单高效。