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"; //删除可以改为String hqlDelete="delete Person";即可
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五 批量处理
时间: 2024-12-14 04:02:53
Hibernate五 批量处理的相关文章
Exchange 2010 (五) 批量新增邮箱
Exchange 2010 (五)批量新增邮箱 在企业中,经常会遇到批量新增邮箱的时候,少量的可以手动添加,量大的话手动就很耗时了,新增时一般会把"下一次登录更改密码"启用,这样密码是自己设置的增加安全性.下面就把批量新增邮箱的步骤写一下. 大致可分为以下几步 注册表启用"登录时更改密码"选项 编辑Excel文件为特定格式 控制台导入邮箱 注册表启用"登录时更改密码"选项 打开客户端访问服务器的注册表 定位到HKEY_LOCAL_MACHINE\
Hibernate框架学习(五)——批量查询(概述)
一.HQL查询(Hibernate Query Language)多表查询,但不复杂时使用 Hibernate独家查询语言,属于面向对象的查询语言 1.基本查询 2.条件查询 注意:HQL语句中不可能出现任何数据库相关的信息 1)?占位符 2)命名占位符 3.分页查询 二.Criteria查询(单表条件查询) Hibernate自创的无语句,面向对象查询 1.基本查询 2.条件查询: SQL中的表示 Criteria中的表示 > gt >= ge < lt <= le == eq
Hibernate的批量插入(&;&;JDBC)
一.批量插入(两种方式) 1,通过hibernate缓存 如果这样写代码进行批量插入(初始设想): package com.anlw.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import or
Hibernate 中批量处理数据
一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作 数据库层面 (2)使用JDBC API进行批量操作 数据库层面 (3)使用Session进行批量操作 会进缓存 1.使用HQL进行批量操作 HQL可以查询数据,也可以批量插入.更新和删除数据.HQL批量操作实际上直接在数据库中完成,处理的数据不需要加载到Session缓存中.使用Query接口的execu
Hibernate的批量处理和分页技术、投影技术
投影查询——过滤部分字段返回的List集合元素为Object[] Query query = session.createQuery("select c.cname, c.csex from Customer c"); List list = query.list(); Iterator iter = list.iterator(); Object[] objs = null; while(iter.hasNext()){ objs = (Object[]) iter.next();
hibernate(五) hibernate一对一关系映射详解
序言 之前讲解了一对多(单向.双向).多对多(双向),今天就讲解一下最后一个关系,一对一. 心情不错.状态也挺好的,赶紧写一篇博文造福一下大家把. --WZY 一.一对一关系的概述 一对一关系看起来简单,其实也挺复杂的.其中关系就包含了四种,单向双向和主键关联外键关联. 什么意思呢,也就是包含了单向一对一主键关联.双向一对一主键关联,单向一对一外键关联,双向一对一外键关联, 这四种中,单双向就不用在说了把,就是看你业务需求来去设置是否是单双向,而外键关联也很简单,前面的一对多和多对多度是依靠外键
Hibernate(五)——面向对象查询语言和锁
Hibernate做了数据库中表和我们实体类的映射,使我们不必再编写sql语言了.但是有时候查询的特殊性,还是需要我们手动来写查询语句呢,Hibernate框架为了解决这个问题给我们提供了HQL(Hibernate Query Language)面向对象的查询语言,和QBC(Query by Criteria)完全面向对象的查询,这里简单总结一下如何是面向对象来编写ql语句呢. 一,HQL,Hibernate框架中的查询语言,是一种面向对象查询语言,和sql语句还是非常类似的,就是将sql
Elasticsearch5.0 Java Api(五) -- 批量导出索引
从索引库中将检索到的数据导出到外部文件,文件格式为.json 1 package com.juyun.test; 2 3 import java.io.BufferedWriter; 4 import java.io.File; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 import java.net.InetAddress; 8 import java.net.UnknownHostException; 9 10
Hibernate(五)基本数据类型
一.Hibernate的基本数据类型 3种数据类型之间的对应关系 Hibernate映射类型 Java类型 标准SQL类型 integer java.lang.Integer INTEGER long java.lang.Long BIGINT short java.lang.Short SMALLINT float java.lang.Float FLOAT double java.lang.Double DOUBLE big_decimal java.math.BigDecimal NUME