Hibernate还是比较常用的,于是我研究了一下Hibernate插入操作,在这里拿出来和大家分享一下,希望对大家有用。
为铜鼓等地区用户提供了全套网页设计制作服务,及铜鼓网站建设行业解决方案。主营业务为成都网站建设、网站建设、铜鼓网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
在项目的开发过程之中,由于项目需求,我们常常需要把大批量的数据插入到数据库。数量级有万级、十万级、百万级、甚至千万级别的。如此数量级别的数据用Hibernate插入操作,就可能会发生异常,常见的异常是OutOfMemoryError(内存溢出异常)。
首先,我们简单来回顾一下Hibernate插入操作的机制。Hibernate要对它内部缓存进行维护,当我们执行Hibernate插入操作时,就会把要操作的对象全部放到自身的内部缓存来进行管理。
谈到Hibernate的缓存,Hibernate有内部缓存与二级缓存之说。由于Hibernate对这两种缓存有着不同的管理机制,对于二级缓存,我们可以对它的大小进行相关配置,而对于内部缓存,Hibernate就采取了“放任自流”的态度了,对它的容量并没有限制。现在症结找到了,我们做海量数据插入的时候,生成这么多的对象就会被纳入内部缓存(内部缓存是在内存中做缓存的),这样你的系统内存就会一点一点的被蚕食,如果最后系统被挤“炸”了,也就在情理之中了。
我们想想如何较好的处理这个问题呢?有的开发条件又必须使用Hibernate来处理,当然有的项目比较灵活,可以去寻求其他的方法。
笔者在这里推荐两种方法:
1.优化Hibernate,程序上采用分段插入及时清除缓存的方法。
2.绕过Hibernate API ,直接通过 JDBC API 来做批量插入,这个方法性能上是最 好的,也是最快的。
对于上述中的方法1,其基本是思路为:优化Hibernate,在配置文件中设置Hibernate.jdbc.batch_size参数,来指定每次提交SQL的数量;程序上采用分段插入及时清除缓存的方法(Session实现了异步write-behind,它允许Hibernate显式地写操作的批处理),也就是每插入一定量的数据后及时的把它们从内部缓存中清除掉,释放占用的内存。
设置Hibernate.jdbc.batch_size参数,可参考如下配置。
- ……
name=“ hibernate.jdbc.batch_size”>50 - ……
配置Hibernate.jdbc.batch_size参数的原因就是尽量少读数据库,Hibernate.jdbc.batch_size参数值越大,读数据库的次数越少,速度越快。从上面的配置可以看出,Hibernate是等到程序积累到了50个SQL之后再批量提交。
笔者也在想,Hibernate.jdbc.batch_size参数值也可能不是设置得越大越好,从性能角度上讲还有待商榷。这要考虑实际情况,酌情设置,一般情形设置30、50就可以满足需求了。
程序实现方面,笔者以插入10000条数据为例子,如
- Session session=HibernateUtil.currentSession();
- Transatcion tx=session.beginTransaction();
- for(int i=0;i<10000;i++)
- {
- Student st=new Student();
- st.setName(“feifei”);
- session.save(st);
- if(i%50==0)
- //以每50个数据作为一个处理单元
- {
- session.flush();
- //保持与数据库数据的同步
- session.clear();
- //清除内部缓存的全部数据,及时释放出占用的内存
- }
- }
- tx.commit();
- ……
【编辑推荐】
新闻标题:分析Hibernate插入操作
链接URL:http://www.shufengxianlan.com/qtweb/news48/103848.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联