Hibernate批量处理
一 批量插入
将很多条记录插入数据库时,Hibernate通常会采用以下做法:
public void test() {
for(int i=0;i<1000;i++){
Person p =new Person("admin"+i,1234+i,new Date());
session.persist(p);
System.out.println(p);
}
}
但是随着这个程序的运行,会在某个时刻失败,并抛出OutOfMemoryException,这是因为Hibernate的Session持有一个必选的一级缓存,所有的Person实例都将在这个Session级别的缓存区存放。
解决方案:定时将Session缓存的数据刷入数据库。
public void test() {
for(int i=0;i<1000;i++){
Person p =new Person("admin"+i,1234+i,new Date());
session.persist(p);
if(i%10==0){
session.flush(); //可以立即同步持久化状态数据到数据库表
session.clear();
}
System.out.println(p);
}
tx.commit();
}
二 批量更新
上面的方法依然适用,应该使用scroll()方法,从而充分利用服务器端游标所带来的性能优势。
public class myTest {
public static void main(String[] args) {
Configuration config=new Configuration().configure();
SessionFactory factory=config.buildSessionFactory();
Session session=factory.openSession();
Transaction tx=session.beginTransaction();
ScrollableResults persons=session.createQuery("from Person")
.setCacheMode(CacheMode.IGNORE)
.scroll(ScrollMode.FORWARD_ONLY);
int count=0;
while(persons.next()){
Person p=(Person) persons.get(0);
p.setName("name:"+count);
if(++count%10==0){
session.flush();
session.clear();
}
}
tx.commit();
session.close();
}
}
但是这种方式效率不高,因为要先执行查询语句,在执行数据更新。为了避免这种情况,Hibernate提供了一种类似于DML语句的批量更新、批量删除的HQL语法。
三 DML风格的批量更新/删除
语法格式:
update | delete from? <ClassName> [where where_conditions]
注意:from关键字可选,from自居中只能有一个类名,可以在该类名后指定别名。不能在批量HQL语句中使用连接,显式或隐式的都不行,但可以在where子句中使用子查询。
public class myTest {
public static void main(String[] args) {
Configuration config=new Configuration().configure();
SessionFactory factory=config.buildSessionFactory();
Session session=factory.openSession();
Transaction tx=session.beginTransaction();
String hqlUpdate="update Person p set name= :newName";
int updateEntities=session.createQuery(hqlUpdate)
.setString("newName","新名字")
.executeUpdate();
tx.commit();
session.close();
}
}
批量删除:
public class myTest {
public static void main(String[] args) {
Configuration config=new Configuration().configure();
SessionFactory factory=config.buildSessionFactory();
Session session=factory.openSession();
Transaction tx=session.beginTransaction();
String hqlDelete="delete Person";
int updateEntities=session.createQuery(hqlDelete)
.executeUpdate();
tx.commit();
session.close();
}
}

Hibernate四 批量处理的更多相关文章

  1. hibernate的批量删除

    转自:hibernate的批量删除一般而言,hibernate的批量删除的写法有两种,一种是hibernate内置的批量删除,不过他的批量删除是将每条记录逐一生成删除语句,其效率极低,当然我们可以使用 ...

  2. Hibernate的批量抓取

    批量抓取理解:如果我们需要查找到客户的所有联系人的话,按照正常的思路,一般是首先查询所有的客户,得到返回的客户的List集合.然后遍历List集合,得到集合中的每一个客户,在取出客户中的联系人(客户表 ...

  3. Hibernate(四)之对象状态及一级缓存

    一.Hibernate中的对象状态 1.1.瞬时态(临时态) 没有与Hibernate产生关联 与数据库中的记录没有产生关联(有关联就是与数据库中表的id相对应) 获得:一般都只直接创建(new) 瞬 ...

  4. Hibernate的批量插入(&&JDBC)

    来自: http://blog.csdn.net/an_2016/article/details/51759890 一.批量插入(两种方式) 1,通过hibernate缓存 如果这样写代码进行批量插入 ...

  5. hibernate(四) 双向多对多映射关系

    序言 莫名长了几颗痘,真TM疼,可能是现在运动太少了,天天对着电脑,决定了,今天下午花两小时去跑步了, 现在继上一章节的一对多的映射关系讲解后,今天来讲讲多对多的映射关系把,明白了一对多,多对多个人感 ...

  6. Hibernate的批量处理

    Hibernate完全以面向对象的方式操作数据库,当程序员以面向对象的方式操作持久化对象时,将自动转换为对数据的操作.例如我们Session的delete()方法,来删除持久化对象,Hibernate ...

  7. Hibernate、批量操作数据

    Hibernate 批量操作数据可以使用两种方法实现 1.分批更新,每一小批同步一次数据: public void saveEmployee2(){ Session s=HibernateSessio ...

  8. 使用JPA和Hibernate进行批量处理的最佳方式

    Tips 原文作者:Vlad Mihalcea 原文地址:The best way to do batch processing with JPA and Hibernate 在本文中,你将了解什么是 ...

  9. Hibernate(四)结构-基础语义和事务

    一.基础语义 核心: Configuration SessionFactory Session 二.Configuration Configuration类负责管理Hibernate的配置信息,Hib ...

随机推荐

  1. 【转】 IOS,objective_C中用@interface和 @property 方式声明变量的区别

    原文: http://blog.csdn.net/ganlijianstyle/article/details/7924446 1.在  @interface :NSObject{} 的括号中,当然N ...

  2. javascript社交平台分享-新浪微博、QQ微博、QQ好友、QQ空间、人人网

    整理的五个社交平台的分享 <!doctype html> <html lang="en"> <head> <meta charset=&q ...

  3. 通过移位与或非运算获取整形最大值,最小值,以及获取输入的int类型整数的二进制表示

    以上是最终效果 实现类: package com.corejava.chap02; public class IntBin { private int value; public IntBin(int ...

  4. SGU 143.Long Live the Queen(女王万岁)

    时间限制:0.25s 空间限制:4M 题意: 有n(n<=16000)个小镇,每两个小镇有且仅有一条路径相连.每个小镇有一个收益x(-1000<=x<=1000). 现在要求,选择一 ...

  5. ICE学习第四步-----客户端请求服务器返回数据

    这次我们来做一个例子,流程很简单:客户端向服务器发送一条指令,服务端接收到这条指令之后,向客户端发送数据库中查询到的数据,最终显示在DataGridView上. 根据上一篇文章介绍的Slice语法,我 ...

  6. PHP数据库

    目录 1.创建数据库连接 2.创建数据库 3.选择数据库 4.设置当前连接使用的字符编码 5.创建表 6.插入数据 7.取得数据查询结果 8.关闭连接 1.创建数据库连接 //mysql_connec ...

  7. dedecms 常用标签调用

    /*------------------单个ip调用-------------------*/ {dede:type typeid="12"} <a title=" ...

  8. JS 导出图片,toDataURL

    //输出图片 function exportCanvasAsPNG(id, fileName) { //获取canvas元素 var canvasElement = document.getEleme ...

  9. hdfs 常用命令

    (2)bin/hdfs dfs -mkdir -p /home/雨渐渐 (3)scp /media/root/DCE28B65E28B432E/download/第2周/ChinaHadoop第二讲\ ...

  10. BZOJ 1823 满汉全席

    Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而 ...