Hibernate的批量操作

批量插入

Hibernate强制开启了一级缓存,缓存空间是有限的,如果批量操作的SQL语句太多,就会运行失败(内存溢出),

因此在批量操作的时候,每执行一批SQL语句,都需要刷新缓存,例如下面这样,每执行20条SQL,刷新一次缓存。

1         for (int i = 0; i < 10000; i++) {
2             User u = new User("张三", 20, "中国广州");
3             sess.save(u);
4             if (i % 20 == 0) {
5                 sess.flush();
6                 sess.clear();
7             }
8         }

除了对session级别的缓存进行清理,hibernate还建议如下配置来关闭SessionFactory的二级缓存

hibernate.cache.use_second_level_cache false

批量更新

与批量插入一样,都需要清空一级缓存。

在更新数据前,需要先查出数据,用scroll()方法查出数据,可以使用游标带来的性能优势(next()方法).

例如下面这样,

 1         ScrollableResults users = sess.createQuery("from User")
 2                 .setCacheMode(CacheMode.IGNORE)
 3                 .scroll(ScrollMode.FORWARD_ONLY);
 4         int count = 0;
 5         while (users.next()) {
 6             User u = (User) users.get(0);
 7             u.setName("新用户名"+count);
 8             if (++count % 20 == 0) {
 9                 sess.flush();
10                 sess.clear();
11             }
12         }

上面是逐行更新,适合每行要更新成不同值的情况。这种更新速度会很慢,下面这种更新则是真正的批量更新,查询和更新都使用同一条语句,适用于所有行都更新成相同值。

DML风格的批量更新

1         String hqlUpdate = "Update User u set name = :newName";
2         int updateEntities = sess.createQuery(hqlUpdate)
3                 .setString("newName", "新名字")
4                 .executeUpdate();

DML风格的批量删除

1         String hqlUpdate = "delete User";
2         //返回最后一条SQL语句影响的行数
3         int updateEntities = sess.createQuery(hqlUpdate)
4                 .executeUpdate();

DML风格的操作性能明显比前面的好,但是在更新的时候貌似只能把所有行更新成相同值,在删除的时候只能返回最后一个SQL所影响的行数。

时间: 2024-12-29 22:38:54

Hibernate的批量操作的相关文章

hibernate整理

国外框架项目地址:http://websystique.com/springmvc/spring-mvc-4-angularjs-example/ Angularjs文本输入框用ng-moduel,其他的用{{ }} 放行用.*? Angularjs插件地址http://www.cnblogs.com/pilixiami/p/5634405.html UI班的教程:http://pan.baidu.com/share/link?shareid=4146906997&uk=866705889 非严

笔记之_java整理hibernate

页面调试数据: <%@taglib uri="/struts-tags" prefix="s" %> <s:debug></s:debug> Js清除缓存 使用hibernate延迟加载时,并且数据库有关联关系,转换成json对象时不能直接转换,要用new JSONObject(),然后put()方法存值 国外框架项目地址:http://websystique.com/springmvc/spring-mvc-4-angularj

Hibernate管理Session和批量操作

Hibernate管理Session Hibernate自身提供了三种管理Session对象的方法 Session对象的生命周期与本地线程绑定 Session对象的生命周期与JTA事务绑定 Hibernate委托程序管理Session对象的生命周期 在Hibernate的配置文件中,hibernate.current_session_context_class属性用于指定Session管理方式,可选值包括 thread:Session对象的生命周期与本地线程绑定 jta*:Session对象的生

Hibernate批量操作

批量处理数据:指的是在一个事务场景中需要处理大量数据.Hibernate进行批量处理数据的方式: 1.使用HQL进行批量操作:HQL是跨数据库的,面向对象,但具有局限性,只能用于单个持久化类,不支持连接,不能使用子查询 2.使用JDBC API进行批量操作:操作方式简单,可以在sql中使用不同数据库的特性 3.使用Session进行批量操作:把关系数据加载到内存中操作,需要通过代码处理复杂的业务逻辑 使用HQL进行批量操作:  1.HQL可以查询数据,批量插入和更新以及删除数据,实际在数据库中完

Hibernate批量操作(一)

在项目的开发过程之中,我们常会遇到数据的批量处理问题.在持久层采用Hibernate框架时,在进行批量操作时,需要考虑Hibernate实现机制带来的一些问题. 我们知道在每个Hibernate Session中都维持了一个必选的数据缓存,所有保存的实例都将保存在Session缓存中,这个缓存随着Session的创建而存在,随着Session的销毁而消亡.这个内部缓存正常情况下是由Hibernate自动维护的,并且没有容量限制.在批量插入与更新时,由于每次保存的实体都会保存在Session缓存中

Hibernate深入浅出(九)持久层操作——数据保存&amp;批量操作

数据保存: 1)session.save session.save方法用于实体对象到数据库的持久化操作.也就是说,session.save方法调用与实体对象所匹配的Insert SQL,将数据插入库表. 结合一个简单实例来进行讨论: 1 2 3 4 5 TUser user = new TUser(); user.setName("Luna"); Transaction tx = session.beginTransaction(); session.save(user); tx.co

Hibernate批量操作(二)

Hibernate提供了一系列的查询接口,这些接口在实现上又有所不同.这里对Hibernate中的查询接口进行一个小结. 我们首先来看一下session加载实体对象的过程:Session在调用数据库查询前,首先会在缓存中进行查询.如果在内部缓存中通过实体类型和id进行查找并命中,数据状态合法,则直接返回.如果内部缓存中未发现有效数据,则查询第二级缓存,如果第二级缓存命中,则返回.如在第二级缓存中没有命中,则发起数据库查询操作(Select SQL),根据映射配置和Select SQL得到的Res

hibernate 批量操作saveOrUpdateAll

1.    getHibernateTemplate().saveOrUpdateAll(entities): getHibernateTemplate().deleteAll(entities): hibernate提供的批量增加和修改的方法 ,参数是实体类集合. 其实跟saveOrUpdate(Object obj) 一样,最终操作使用的是session.saveOrUpdate(entityName, entity);  循环使用的是同一个session对象.不确定是否效率比自己写外部循环

Hibernate 缓存机制

一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据. 二.what(Hibernate缓存原理是怎样的?)Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存. 1.Hibernate一级缓存又称为“Session的