很多人都对Java在批量数据的处理方面是否是其合适的场所持有怀疑的念头,由此延伸,那么就会认为ORM可能也不是特别适合数据的批量处理。 其实,我想如果我们应用得当的话,完全可以消除ORM批量处理性能问题这方面的顾虑。下面以Hibernate为例来做为说明,假如我们真的不得不在Java中使用Hibernate来对数据进行批量处理的话。 向数据库插入100 000条数据,用Hibernate可能像这样:
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条的时候,就会出现内存溢出而失败。这是Hibernate把最近插入的Customer都以session-level cache在内存做缓存,我们不要忘记Hiberante并没有限制first-level cache 的缓存大小:
# 持久对象实例被管理在事务结束时,此时Hibernate与数据库同步任何已经发生变 化的被管理的的对象。
# Session实现了异步write-behind,它允许Hibernate显式地写操作的批处理。 这里,我给出Hibernate如何实现批量插入的方法:
首先,我们设置一个合理的JDBC批处理大小,hibernate.jdbc.batch_size 20。 然后在一定间隔对Session进行flush()和clear()。
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 ) { //flush 插入数据和释放内存: session.flush(); session.clear(); } } tx.commit(); session.close(); |
那么,关于怎样删除和更新数据呢?那好,在Hibernate2.1.6或者更后版本,scroll() 这个方法将是最好的途径:
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); ScrollableResults customers = session.getNamedQuery("GetCustomers") .scroll(ScrollMode.FORWARD_ONLY); int count=0; while ( customers.next() ) { Customer customer = (Customer) customers.get(0); customer.updateStuff(...); if ( ++count % 20 == 0 ) { //flush 更新数据和释放内存: session.flush(); session.clear(); } } tx.commit(); session.close(); |
这种做法并不困难,也不算不优雅。请注意,如果Customer启用了second-level caching ,我们仍然会有一些内存管理的问题。原因就是对于用户的每一次插入和更新,Hibernate在事务处理结束后不得不通告second-level cache 。因此,我们在批处理情况下将要禁用用户使用缓存。
分享到:
相关推荐
本文将讨论使用 Hibernate 批量更新大量数据的方法和技巧。 批量更新的必要性 在实际应用中,我们经常需要将大量数据插入到数据库中,例如数据迁移、数据同步、数据备份等场景。在这些场景中,如果使用传统的 ...
4. Spring Batch:Spring框架下的批量处理组件,提供完整的批量处理解决方案,包括分割、读取、处理和写入。 总结,Java数据批量处理涉及到文件读写、数据结构、并行处理、数据库操作、性能优化等多个方面。开发者...
为了克服这些问题,批量处理成为了一种常见的解决方案。 #### 三、批量处理的实现方式 根据给定的内容,我们可以总结出以下几种批量处理的方法: ##### 1. 通过Session进行批量操作 在使用Session进行批量操作时...
当涉及到批量数据处理时,如大批量的更新和删除操作,性能和效率成为开发者需要重点考虑的问题。本文将详细介绍如何在使用JSP和Hibernate环境下进行高效的批量更新与删除操作。 ### 批量更新与批量删除 批量操作指...
以下是针对Hibernate批量处理海量数据的一些关键知识点和优化策略: 1. **理解Hibernate的工作原理**:Hibernate通过查询数据库获取数据,并将其转化为Java对象存储在内存中,这种做法在处理小量数据时非常便捷,但...
### Struts2批量提交数据解决方案 在Web应用开发过程中,特别是在使用Struts2框架时,经常需要处理大量的数据提交操作。这些数据可能来自于用户输入或者是系统内部的数据迁移等场景。对于这种需求,本文档将详细...
针对这种情况,Hibernate提供了一些批量处理的解决方案。 批量插入是处理大量数据插入的一种有效方法。通常,初学者可能会尝试一次性创建大量对象并调用Session的save()方法来保存,但这会导致所有对象被存储在...
五、远程服务器的挑战与解决方案: 在远程服务器上进行数据库操作,网络延迟会成为性能瓶颈。为优化性能,可以采取以下策略: 1. 数据库复制:设置数据库镜像或读写分离,将读操作分散到多个副本服务器上。 2. 异步...
总的来说,这个项目结合了ExtJS的前端交互性,Struts的控制逻辑,以及Hibernate的数据持久化能力,提供了一个完整的文件批量上传解决方案。用户可以方便地上传、查看和管理文件,而系统则能确保数据的一致性和安全性...
通过提供数据持久化的解决方案,Hibernate提高了开发效率,降低了数据库访问的复杂性。 ### 2. 安装与配置 在开始使用Hibernate之前,需要将其库文件添加到项目的类路径中。`Hibernate3.1_DOC_CN.chm`文件包含的是...
在IT行业中,Hibernate是一个非常流行的Java对象关系映射(ORM)框架,它允许开发者使用面向对象的编程方式来操作数据库,极大地简化了数据访问层的开发。然而,有时候在使用Hibernate的过程中,可能会遇到一些问题...
综上所述,Hibernate 4.3.7 提供了全面的ORM解决方案,通过其丰富的特性、良好的性能以及对现代Java生态系统的支持,极大地简化了企业级应用的数据库开发工作。对于Java开发者来说,深入理解和熟练运用Hibernate是...
Hibernate是Java中最流行的ORM解决方案之一,它通过XML或注解方式定义映射,使得对象可以直接在数据库中存取。 3. **Hibernate配置**:教程可能详细讲解如何配置Hibernate,包括创建hibernate.cfg.xml文件,设置...
为解决这些问题,Hibernate 3引入了HQL(Hibernate Query Language)来支持批量更新和删除。例如,要删除所有User对象,只需执行HQL语句`delete User`,然后调用`Query.executeUpdate()`方法。这种方式与直接使用...
Hibernate 是一个开放源代码的 Java 持久化框架,它为对象关系映射(Object Relational Mapping, ORM)提供了一套完整的解决方案。ORM 是一种将面向对象程序设计语言中对象的状态存储到数据库中的机制。在 ORM 的...
Hibernate 4.1.6 Final 版本是该框架的一个成熟版本,它包含了多项性能优化、新特性和bug修复,旨在提供更稳定、更高效的数据持久化解决方案。 #### 数据库访问与配置 在 Hibernate 中,数据库访问是通过 JDBC ...
- Hibernate简化了数据访问层的代码,提供ORM(对象关系映射)解决方案,增强了反射机制,性能优秀,支持多种关系映射。 6. **延迟加载(Lazy Loading)**: - Hibernate通过延迟加载策略,只在实际访问数据时才...
- **4.3.2 Hibernate数据源属性**: 如使用哪种数据源类型。 - **4.3.3 可选的配置属性**: - **4.3.3.1 Hibernate配置属性**: 如show_sql用于控制是否显示执行的SQL语句。 - **4.3.3.2 Hibernate JDBC和连接...
Hibernate是一款强大的Java持久化框架,它为Java开发者提供了一种对象关系映射(ORM)解决方案,使得在Java应用中管理数据库变得更加便捷。本中文文档旨在详细介绍Hibernate的核心概念、配置、使用方法以及最佳实践。 ...