在最近的SSH项目里面需要做大量数据上传(上万条数据的insert),而问题的现象就是刚开始速度很快,每秒几十条,随时时间越往后上传速度越慢,最后只有每秒一条。Web服务器的CPU占有率和内存都进行过调查,没有问题,代码也进行了无数次的优化,问题还是没有解决。最后才发现原来是Hibernate的Session的问题。最后使用StatelessSession,问题解决。
StatelessSession (无状态session)接口
利用无状态session,可以解决:大批量上传、修改数据缓慢的问题。
注:StatelessSession在Hibernate3.3.2中有,我知道3.0中没有,其他的不知道
作为选择,Hibernate提供了基于命令的API,可以用detached object的形式把数据以流的方法加入到数据库,或从数据库输出。StatelessSession没有持久化上下文,也不提供多少高层的生命周期语义。特别是,无状态session不实现第一级cache,也不和第二级缓存,或者查询缓存交互。它不实现事务化写,也不实现脏数据检查。用stateless session进行的操作甚至不级联到关联实例。stateless session忽略集合类(Collections)。通过stateless session进行的操作不触发Hibernate的事件模型和拦截器。无状态session对数据的混淆现象免疫,因为它没有第一级缓存。无状态session是低层的抽象,和低层JDBC相当接近。
StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
ScrollableResults customers = session.getNamedQuery("GetCustomers")
.scroll(ScrollMode.FORWARD_ONLY);
while ( customers.next() ) {
Customer customer = (Customer) customers.get(0);
customer.updateStuff(...);
session.update(customer);
}
tx.commit();
session.close();
注意在上面的例子中,查询返回的Customer实例立即被脱管(detach)。它们与任何持久化上下文都没有关系。
StatelessSession 接口定义的insert(), update() 和 delete()操作是直接的数据库行级别操作,其结果是立刻执行一条INSERT, UPDATE 或 DELETE 语句。因此,它们的语义和Session 接口定义的save(), saveOrUpdate() 和delete() 操作有很大的不同。
分享到:
相关推荐
在Java开发中,尤其是涉及到大数据量的处理时,人们往往会质疑ORM框架,如Hibernate,是否适合进行批量数据操作。然而,实际上,通过适当的技术手段,我们可以有效地解决Hibernate在批量处理时可能出现的性能问题。...
- 主要用于解决懒加载异常,将Hibernate Session与请求线程绑定,保证页面读取数据时Session开启状态。 - 遇到业务处理数据量大时,可能会引起内存溢出或者数据库连接问题。 - 解决方式可以考虑使用迫切左外连接...
12.2.3 使用无状态的会话 12.3 数据过滤和拦截 12.3.1 动态数据过滤 12.3.2 拦截Hibernate事件 12.3.3 内核事件系统 12.3.4 实体监听器和回调 12.4 小结 第13章 优化抓取和高速缓存 ...
6. 批量操作:优化大批量数据的处理,如Session.saveOrUpdateAll()。 六、最佳实践 1. 使用注解:尽量避免XML映射文件,使用注解进行ORM配置。 2. 事务管理:合理划分事务边界,避免脏读、不可重复读等问题。 3. ...
例如,合理使用缓存策略,避免N+1查询问题,以及在处理大批量数据时启用批处理等。 6. **实战应用**: 学习Hibernate不仅仅是理论,更需要通过实际项目来提升技能。可以尝试搭建一个简单的CRUD应用,逐步理解和...
3. 更强大的批处理:通过改进的批处理策略,减少了数据库交互次数,提升了大批量数据处理能力。 4. 新的事件监听器:提供了更多扩展点,方便自定义业务逻辑。 五、实际应用 在实际开发中,Hibernate常用于企业级...
批量处理是提高数据处理效率的有效手段,文档讨论了批量插入、批量更新以及大批量更新/删除的实现方法,有助于优化数据库操作的性能。 总之,这份文档不仅是一份关于Hibernate使用的总结,更是深入学习和掌握该框架...
5. 深入理解 Hibernate 的自动批处理机制,优化大批量数据操作。 通过深入学习和熟练运用 Hibernate 4.1.8.Final,开发者可以在 Java 应用中实现高效、稳定的数据库操作,提高项目开发效率,降低维护成本。无论是在...
- **无状态 Session 接口**:解释如何使用 StatelessSession 接口进行高效的数据操作。 - **DML 风格操作**:展示如何使用类似 DML 的风格执行批量操作。 #### 十六、HQL:Hibernate 查询语言 - **大小写敏感性**:...
探讨了如何利用Hibernate进行高效的批量数据处理,包括批量插入、批量更新和大批量更新/删除操作,以及如何通过合理配置提升应用的整体性能。这部分对于处理大数据量的应用场景尤为重要。 七、Hibernate与J2EE应用...
批量处理技术,如批量插入、批量更新和大批量更新/删除,可以显著提高大量数据的处理效率。Hibernate的HQL(Hibernate Query Language)是一种面向对象的查询语言,用于执行复杂的数据检索和聚合操作。HQL语法类似于...
13.3. 大批量更新/删除(Bulk update/delete) 14. HQL: Hibernate查询语言 14.1. 大小写敏感性问题 14.2. from子句 14.3. 关联(Association)与连接(Join) 14.4. select子句 14.5. 聚集函数 14.6. 多态查询 14.7. ...
14.3. 大批量更新/删除(Bulk update/delete) 15. HQL: Hibernate查询语言 15.1. 大小写敏感性问题 15.2. from子句 15.3. 关联(Association)与连接(Join) 15.4. select子句 15.5. 聚集函数 15.6. 多态查询 ...
当涉及到批量数据处理时,如大批量的更新和删除操作,性能和效率成为开发者需要重点考虑的问题。本文将详细介绍如何在使用JSP和Hibernate环境下进行高效的批量更新与删除操作。 ### 批量更新与批量删除 批量操作指...
适用于需要频繁进行大批量数据读取的应用场景,例如报表系统、数据分析平台等。 #### 二、Batch Size的合理配置 **知识点解析:** Batch Size是指在执行批量操作时,Hibernate一次提交的SQL语句数量。合理的Batch ...
4. 性能优化:Hibernate框架在操作数据库时可能会产生性能瓶颈,特别是在大批量数据操作时。性能优化可以包括合理配置二级缓存、优化HQL查询语句、使用批量操作减少数据库交互次数、控制懒加载的使用等。在配置时,...
14.3. 大批量更新/删除(Bulk update/delete) 15. HQL: Hibernate查询语言 15.1. 大小写敏感性问题 15.2. from子句 15.3. 关联(Association)与连接(Join) 15.4. select子句 15.5. 聚集函数 15.6. 多态查询 ...
13.3. 大批量更新/删除(Bulk update/delete) 14. HQL: Hibernate查询语言 14.1. 大小写敏感性问题 14.2. from子句 14.3. 关联(Association)与连接(Join) 14.4. select子句 14.5. 聚集函数 14.6. 多态查询 14.7. ...