spring+hibernate 大批量处理数据
来源:互联网 发布:windows资源管理器 编辑:程序博客网 时间:2024/06/05 17:59
使用Hibernate将 100 000 条记录插入到数据库的一个很自然的做法可能是这样的
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
}
tx.commit();
session.close();
这段程序大概运行到 50 000条记录左右会失败并抛出
我们会在本章告诉你如何避免此类问题。首先,如果你要执行批量处理并且想要达到一个理想的性能,那么使用JDBC的批量(batching)功能是至关重要。将JDBC的批量抓取数量(batch size)参数设置到一个合适值(比如,10-50之间):
hibernate.jdbc.batch_size 20
你也可能想在执行批量处理时关闭二级缓存:
hibernate.cache.use_second_level_cache false
14.1. 批量插入(Batch inserts)
如果要将很多对象持久化,你必须通过经常的调用
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
if ( i % 20 == 0 ) {
//20, same as the JDBC batch size
//20,与JDBC批量设置相同
//flush a batch of inserts and release memory:
//将本批插入的对象立即写入数据库并释放内存
session.flush();
session.clear();
}
}
tx.commit();
session.close();
14.2. 批量更新(Batch updates)
此方法同样适用于检索和更新数据。此外,在进行会返回很多行数据的查询时,你需要使用
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
ScrollableResults customers = session.getNamedQuery("GetCustomers").setCacheMode(CacheMode.IGNORE).scroll(ScrollMode.FORWARD_ONLY); int count=0;
while ( customers.next() ) {
Customer customer = (Customer) customers.get(0);
customer.updateStuff(...);
if ( ++count % 20 == 0 ) {
//flush a batch of updates and release memory:
session.flush();
session.clear();
}
}
tx.commit();
session.close();
14.3. 大批量更新/删除(Bulk update/delete)
就像已经讨论的那样,自动和透明的 对象/关系 映射(object/relational mapping)关注于管理对象的状态。这就意味着对象的状态存在于内存,因此直接更新或者删除 (使用 SQL语句
UPDATE
在FROM子句(from-clause)中,FROM关键字是可选的
在FROM子句(from-clause)中只能有一个类名,并且它不能有别名
不能在大批量HQL语句中使用连接(显式或者隐式的都不行)。不过在WHERE子句中可以使用子查询。
整个WHERE子句是可选的。
举个例子,使用Query.executeUpdate()方法执行一个HQL
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String hqlUpdate = "update Customer set name = :newName where name = :oldName";
int updatedEntities = s.createQuery( hqlUpdate ).setString( "newName", newName ).setString( "oldName", oldName ).executeUpdate();tx.commit();
session.close();
执行一个HQL
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String hqlDelete = "delete Customer where name = :oldName";
int deletedEntities = s.createQuery( hqlDelete ).setString( "oldName", oldName ) .executeUpdate();
tx.commit();
session.close();
由Query.executeUpdate()方法返回的整型值表明了受此操作影响的记录数量。注意这个数值可能与数据库中被(最后一条SQL语句)影响了的“行”数有关,也可能没有。一个大批量HQL操作可能导致多条实际的SQL语句被执行,举个例子,对joined-subclass映射方式的类进行的此类操作。这个返回值代表了实际被语句影响了的记录数量。在那个joined-subclass的例子中,对一个子类的删除实际上可能不仅仅会删除子类映射到的表而且会影响“根”表,还有可能影响与之有继承关系的joined-subclass映射方式的子类的表。
- Spring+Hibernate大批量处理数据
- Spring+Hibernate处理大批量数据
- Spring+Hibernate大批量处理数据
- Spring+Hibernate大批量处理数据
- spring+hibernate 大批量处理数据
- Spring+Hibernate处理大批量数据
- Spring 处理大批量数据
- 不用存储过程怎么处理大批量数据?读取大批量数据
- 性能之Hibernate大批量保存数据优化
- 【黑马程序员】SqlBulkCopy大批量数据的处理
- 如何处理大批量数据——SQL
- 记录通过mybatis处理大批量oracle数据
- spring,hibernate处理Lob类型数据
- hibernate之大批量和批量操作(利用批量处理)
- hibernate之大批量和批量操作(利用批量处理---实例)
- C# 多线程+队列处理大批量数据,进而缩短处理时间
- 使用BackGroundWork处理大批量数据并用进度条显示进度 (转)
- 使用BackGroundWork处理大批量数据并用进度条显示进度
- kibana一个最简单的过滤
- scala的Stack类源码
- kibana运行的时候找不到node命令
- Unity3D中的自动寻路
- centos 32位下安装gitlab
- spring+hibernate 大批量处理数据
- 读取联系人信息
- 产品经理主观题/群面答法小记
- supervisor 一句话安装
- ViewPager的几种动画效果源代码
- [BZOJ2927][Poi1999]多边形之战(博弈)
- 用JS获取URL的方法(超级简单)
- 设计模式(五)——原型模式
- iOS小技巧总结,绝对有你想要的