Hibernate之海量数据操作

 

  • 批量添加

 

在实际的开发中,当我们遇到百万条以上的数据呢?比如要一次保存10万条的数据,按照我们正常的思维来,应该这么写:

 

session.beginTransaction();
for(int i = 0,i<=100000,i++){
      TUser user = new TUser();
      session.save("user No:"+i);
}
session.getTransaction().commit();

 

 但是这样一来有什么问题呢?程序肯定会以OutOfMemoryError异常而终止!为什么会这样?原因是Hibernate在每次调用session.save()时,都会将此对象纳入自身的内部缓存进行管理,内部缓存(一级缓存)与二级缓存不一样,二级缓存可以设置指定其中的最大容量,但内部缓存并没有这样的限制;

一次加入1百万数据,随着循环,内存会被耗尽,便产生了OutOfMemoryError异常;

 

如何解决这样的问题?

 

  • 首先看下在普通的JDBC里是如何解决?

 

 

String sql = "insert into TUser(name) values(?)";
PreparedStatement ps = conn.prepareStatement(sql);

for(int i=0,i<1000000,i++){
    ps.setString(1,"user "+i);
    ps.addBatch();
}

int[] counts = ps.executeBatch();

 

 这里的ps.addBatch()方法,将数个SQL操作批量提交获得性能上的提升;

 

  • 在hibernate中的解决:
session.beginTransaction();
for(int i=0,i<1000000,i++){
   TUser user = new TUser();
   user.setName("user:"+i);    
   session.save(user);
   if(i%25 == 0){
      session.flush();
      session.clear();
   }
}
session.getTransaction().commit();

 

 阶段性的调用session.clear();这样的话,可以将内部缓存(一级缓存)所占用的空间维持在一个合理的范围内;

但是这样的话,导入时,是个相当耗时的过程,然而还得在进行判断,效率的低,可想而知;这时,Hibernate给我们提供了更好的解决方案:

 

<property name="hibernate.jdbc.batch_size">25</property>

 这样的话,就设定了Hibenrate每次提交SQL的数量;

【Cadence】Virtuoso@LayoutXL 差分电路版图镜像同步技巧详解 本文详细介绍了在Cadence Virtuoso LayoutXL中实现差分电路版图镜像同步的技巧,包括核心需求、环境配置、分步操作指南及高级技巧。通过使用LayoutXL的Group功能,工程师可以高效保持差分电路的对称性,提升版图迭代效率,确保高速信号处理的稳定性。特别适用于深亚微米工艺下的差分放大器设计。 阅读详情

相关推荐

Python实战:3分钟搞定A股K线数据抓取(附东方财富/腾讯API完整代码)

本文为量化交易初学者提供了一份快速获取A股K线数据的实战指南。通过对比东方财富与腾讯财经两大免费API的优劣,并附上可直接运行的完整Python代码,帮助读者在3分钟内搭建起自己的数据抓取管道,为构建量化交易系统奠定坚实的数据基础。

weixin_29062255的博客 2910

hibernate保存十万级数据量的批量保存操作,

图一是我导入的第一张表,最大数据量也就2万多条,hibernate关闭二级缓存勉强能够导入,导入图二的7万多条数据时,就会在执行hibernate的save()停在2万多条.具体配置:1.修改spring的管理hibernate的配置&lt;bean id="webDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-me...

你那么害怕明天,怎么能过好今天! 1万+

ch32v103xx 烧写

烧写方式 串口uart, usb,swd(wch link)但不建议按此使用,参官方说明。

qq_39239990的博客 637

Hibernate进行大数据量处理时的优化操作

1) 在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,所以在使用Hibernate处理大数据量的,可以使用session.clear()或者session. Evict(Object) 在处理过程中,清除全部的缓存或者清除某个对象。 2) 对大数据量查询时,慎用list()或者iterator()返回查询结果, 1. 使用List()返回结...

奋斗的小马 610

解决VMware与Hyper-V/Device Guard冲突的实用指南

本文详细解析了VMware与Hyper-V/Device Guard冲突的根源,并提供了三种实用的解决方案:彻底关闭相关功能、通过启动配置实现选择性引导,以及使用VMware Workstation Pro的Hyper-V兼容模式。指南包含清晰的诊断步骤、操作命令和避坑建议,帮助用户根据自身需求灵活选择,实现虚拟化环境的稳定运行或高效共存。

weixin_29306317的博客 684

CISP-PTE考前实操练习题

CISP-PTE考前学习练习题目,渗透测试功工程师

2301_79546223的博客 2000

hibernate 批量保存数据

一个完整的例子可以参照。 基本

活在当下,畅想未来 6216

刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型

在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。  通过博文了解💝💝💝    1💝💝💝----adb禁用或者删除系统app导致无法开机的几种解决方法 2💝💝💝----如何保数据来无损恢复机型 3💝💝💝----其他保数据解决系统类故障无法开机的步骤解析

小马哥的专栏 1352

hibernate java内存一次能取多少条_【java】itoo项目实战之hibernate 批量保存优化

在itoo中。基本上每一个系统都有一个导入功能,大量的数据填写进入excel模板中。然后使用导入功能导入的数据库中,这样能够大大的提高工作效率。那么导入就涉及到了批量保存数据库的问题了。那么通常情况下,在一个Session对象的缓存中数量有限的持久化对象,等到Session对象处理事务完成,还要关闭Session对象,从而及时释放session的缓存占用的内存。在批量保存1万条数据,假设一次性把须...

weixin_33458169的博客 362

[HQChart教程] 去掉“仅学习使用”文字提示的小技巧

最近用 HQChart 做图表时,发现左下角有“仅学习使用”的字样。这种水印虽然是默认的,但如果要展示给客户,可能会显得不够专业。还好,这个问题很好解决,只需要简单修改一下配置。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 598

机器学习实战1-四种算法对比对客户信用卡还款情况进行预测与模型评估

大家好,我是微学AI,今天给大家带来一个机器学习实战案例:利用机器学习的四种算法对比对客户信用卡还款情况进行分类。信用卡又叫贷记卡,是由商业银行或信用卡公司对信用合格的消费者发行的信用证明。现在的年轻人,特别是80后,90后甚至00后到喜欢超前消费,每个人名下多多少少都有至少一张信用卡,有些人由于过度超前消费,导致下个月无法还款导致的逾期,这样会对个人征信产生影响,今天我们就来分析分析具有哪些特性的人会有信用卡逾期的可能。

微学AI的博客 4710

java hibernate批量更新_Hibernate批量处理海量数据的方法

本文实例讲述了Hibernate批量处理海量数据的方法。分享给大家供大家参考,具体如下:Hibernate批量处理海量其实从性能上考虑,它是很不可取的,浪费了很大的内存。从它的机制上讲,Hibernate它是先把符合条件的数据查出来,放到内存当中,然后再进行操作。实际使用下来性能非常不理想,在笔者的实际使用中采用下面的第三种优化方案的数据是:100000条数据插入数据库, 需要约30分钟,呵呵,晕...

weixin_42116585的博客 1602

Unity 面试篇|(二)Unity基础篇 【全面总结 | 持续更新】

在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。一个程序在运行(执行)的过程中所需要的硬件和软件环境运行时的主要作用是提供程序运行所需要的环境和基础设施,通过为程序提供内存分配、线程管理、类型检查、对象实例化和垃圾回收等操作来支持程序的运行公共语言运行时(Common Language Runtime,CLR)是整个.NET框架的核心,它为.NET应用程序提供了一个托管的代码执行环境。

游戏开发小Y的博客 13万+

oracle 和mysql 查一条数据_Oracle千万条记录插入与查询小结

最近做了个项目,实现对存在千万条记录的库表进行插入、查询操作。原以为对数据库的插入、查询是件很容易的事,可不知当数据达到最近做了个项目,实现对存在千万条记录的库表进行插入、查询操作。原以为对数据库的插入、查询是件很容易的事,可不知当数据达到百万甚至千万条级别的时候,这一切似乎变得相当困难。几经折腾,总算完成了任务。1、 避免使用Hibernate框架Hibernate用起来虽然方便,但对于海量数据...

weixin_28973627的博客 303

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java实现 批量添加实例

做一个生成海量数据的程序!开始分析这个问题 最终总结如下: 方案一 用jdbc 的API 那么这种方法的效率应该是最高的! 方案二 用hibernate 的API 这个方案比第一种方案的效率低! 我开始很犹豫到底用那一种呢!由于我们的项目使用SSH框架的!如果用单纯的JDB

wmh0599的专栏 3589

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Hibernate中报can't insert Or update ,外键错误

主要是因为在插入的时候,外键的值为空,同时也可能是因为set()或者get()方法的数据类型错误,也可能是你的orm配置错误。 我个人认为hibernate太臃肿,海量数据的操作速度十分的慢。

joken_888的专栏 402

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Hibernate与iBATIS的比较

1.出身  hibernate 是当前最流行的o/r mapping框架,它出身于sf.net,现在已经成为jboss的一部分了。  ibatis 是另外一种优秀的o/r mapping框架,目前属于apache的一个子项目了。  2.原理  相对hibernate“o/r”而言,ibatis是一种“sql mapping”的orm实现。hibernate 对数据库结构提供了较为完整的

工作学习笔记 568

iBatis与Hibernate比较

二者优缺点比较:       Hibernate的优点: Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。以数据库字段一一对应映射得到的PO和Hibernte这种对象化映射得到的PO是截然不同的,本质区别在于这种PO是扁平化...

155

Hibernate中如何高效处理海量数据

原文 http://blog.youkuaiyun.com/mikie_hi/archive/2009/10/23/4718671.aspx   最近一直常常看到别人javaeye网站上看到别人在问在hibernate怎么样处理海量数据,怎么样提高性能,本人在优快云博客上看到这篇好的文章,并结合本人一一验证 确实如作者所说 故拿出来和大家分享。希望对初学HIBERNATE框架的朋友有所帮助。 Hib...

qmkemail 158

Hibernate批量处理海量数据的方法

本文实例讲述了Hibernate批量处理海量数据的方法。分享给大家供大家参考,具体如下:Hibernate批量处理海量其实从性能上考虑,它是很不可取的,浪费了很大的内存。从它的机制上讲,Hibernate它是先把符合条件的数据查出来,放到内存当中,然后再进行操作。实际使用下来性能非常不理想,在笔者的实际使用中采用下面的第三种优化方案的数据是:100000条数据插入数据库, 需要约30分钟,呵呵,晕...

John的博客 800

Hibernate批量操作笔记

1、批量插入 大量记录插入数据库有两种处理方式:通过Hibernate缓存、绕过Hibernate直接调用JDBC API。 (1)hibernate缓存

lengxingxing_的博客 445

Hibernate批量处理海量数据的方法(转)

本文实例讲述了Hibernate批量处理海量数据的方法。分享给大家供大家参考,具体如下: Hibernate批量处理海量其实从性能上考虑,它是很不可取的,浪费了很大的内存。从它的机制上讲,Hibernate它是先把符合条件的数据查出来,放到内存当中,然后再进行操作。实际使用下来性能非常不理想,在笔者的实际使用中采用下面的第三种优化方案的数据是:100000条数据插入数据库, 需要约30分钟,呵呵...

朱塔山的博客 425

Hibernate持久层操作

1,数据加载 1),Session.get/load 区别:(1),未发现符合条件的记录:get-->null,load-->ObjectNotFoundException。 (2),load可返回实体的代理类实例,get永远直接返回实体类。 (3),load-->内部缓存-->二级缓存-->SQL(DB),get-->内部缓存-->SQL(DB)。 Session加载实体对象时...

iteye_21244的博客 145
上一篇: hibernate之数据存储
下一篇: hibernate之Collection类型
keithJava
博客等级 码龄16年 2粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值