hibernate里有两种方法获取一个列表数据分别为.iterator()和.list(),那么什么时候使用iterator什么时候使用list呢?
情况一:
每次发送到数据库的sql语句,和返回来的数据基本上都是一模一样的(也就是数据信息和sql语句(搜索条件)很少会修改的),那么这个时候我们应该考虑使用list方法来返回信息,因为list方法第一次执行的时候会把数据库的数据信息都存放到二级缓存中,同时会记录你发送的sql语句,如果下次你还是利用list方法发送一模一样的sql语句,同时数据也没有在被hibernate知道的情况下修改过,那么第二次甚至第n次再执行这个语句的时候,hibernate是不用连接数据库的,而是直接把缓存里的数据返回给你。
例如:获得数据库论坛板块信息,我们知道,数据库论坛板块的信息,基本上半年一年才变动一次。
情况二:
获得论坛某个板块的最新的20条信息,我们知道,论坛的第一页总是显示新发布或则有新回复的帖子,那么我们这个时候能使用list方法来获取信息吗?答案是否定的。它虽然满足了list的条件之一(搜索条件很少会修改的),但是未满足另外一个条件,因为它数据信息的修改是很频繁的(有新帖,或新回复的帖),那么这个时候我们就得考虑使用iterator来获取数据信息,iterator的原理是这样的,首先先发送一条语句(iterator时query的sql:select * from table where id>n 真正发送:select id from table where id>n)获得所有符合条件的ID,然后到二级缓存里边去找这个对象,如果发现,则获取它,如果没发现,则发送一条语句获得该ID的对象(n+1问题),比方说,我们要获得最新20条信息(之前已经查询过一次,但现在有一个新帖),使用iterator方法会先发送一条语句获得满足SQL语句条件的所有的ID,然后因为之前已经查询过一次,所以缓存里边已经有其中的19个帖子的缓存(因为有一个是新帖还没被hibernate查询,所以缓存里边还没有),然后再发送一条条件为ID=新帖ID的SQL语句来获得这个新帖的对象。
总结:当hibernate二级缓存开启时,只要是经由hibernate的session对象来获得的任何对象hibernate都会把它放到缓存里边,当该对象被修改或删除时,hibernate会把该对象在二级缓存中也删除掉。list方法一次获得所有数据同时放到缓存中,如果SQL语句不变同时数据也没被改变的情况下,list直接取的缓存而不用再连接数据库进行检索操作,iterator方法用n+1此来获得所有数据信息同时放到缓存中,不管SQL语句变没变始终会发送一条获得ID的SQL语句,然后根据ID查找缓存,如果没有则再发送一条SQL语句获得该对象,虽然iterator始终会发送一条或(n+1)条,但发送的语句都是根据ID来获取的,所以速度也是非常可观的(相对没有任何缓存机制而言)。
转帖
分享到:
相关推荐
Hibernate二级缓存是ORM框架Hibernate中的一个重要特性,它旨在提高数据访问效率,减少对数据库的直接操作,从而提升系统的响应速度。在大型数据库系统中,合理利用缓存机制能够显著优化性能,尤其是在高并发场景下...
总之,了解并深入分析Hibernate的N+1问题和缓存问题,合理配置和使用Hibernate缓存机制,可以显著提高应用程序的性能。开发者应该根据实际的应用需求和数据访问模式,合理规划缓存策略,并监控应用程序的执行效率,...
1. **列表(List)**:使用`list`方法查询时,Hibernate会在一级缓存中查找结果;如果没有命中,则会查询数据库,并将结果放入缓存。 2. **迭代器(Iterator)**:使用`iterator`方法查询时,Hibernate同样会先尝试...
Hibernate 难点解析: hibernate中uuid和native的相关总结 ...hibernate二级缓存中list和iterator的用法 Hibernate中的对象有三种状态: lock和update区别 save 和update区别 update 和saveOrUpdate区别
当执行诸如save、saveOrUpdate、get、load、list或iterator等方法时,Hibernate会自动将对象放入一级缓存。用户无法直接操作一级缓存内容,但可以通过flush()、evict()和clear()方法间接管理。flush()用于使缓存与...
在JSP开发中,使用Hibernate框架进行数据持久化操作时,二级缓存的配置是一个重要的优化环节。二级缓存能够显著提升应用性能,因为它减少了数据库的访问次数,将经常访问的数据存储在内存中,供多个Session共享。...
例如,如果在没有启用查询缓存时,使用`load()`方法获取的单个持久化对象会被缓存,但若想缓存`findAll()`, `list()`, `Iterator()`, `createQuery()`, `createCriteria()`等方法获取的结果集,必须设置`hibernate....
本文将针对Hibernate中的几个重要概念进行详细讲解,包括主键生成策略、get()与load()的区别以及二级缓存的使用。 首先,探讨的是Hibernate中的主键生成策略。在Hibernate中,主键的生成主要有三种方式:uuid、...
3. **Query 和 list/iterator**:list 仅利用查询缓存,而 iterator 可以利用二级缓存。iterator 在处理大量数据时更为高效,因为它可以逐条加载数据并释放内存。 #### 八、总结 Hibernate 性能调优涉及多个层面,...
标题“使用Hibernate封装方法”暗示我们将讨论如何在项目中通过封装Hibernate操作,以提高代码的复用性和可读性。通常,我们会在DAO(数据访问对象)层进行这些封装,将数据库的CRUD(创建、读取、更新、删除)操作...
Hibernate 源码分析过程 Hibernate 是一个基于 Java 的 ORM...Hibernate 的性能可以通过一级缓存和二级缓存来提高。一级缓存可以缓存对象的状态,二级缓存可以缓存查询结果。 Hibernate 也支持第三方缓存策略。
7. **缓存机制**:Hibernate支持一级缓存(Session级别的)和二级缓存(SessionFactory级别的)。了解何时启用缓存,以及如何配置缓存策略,可以显著提高应用程序的性能。 通过深入研究这个`hibernate_third`项目,...
3. **Query 和 list/iterator**:list 方法仅利用查询缓存,而 iterator 方法可以利用二级缓存。在进行大量数据查询时,iterator 方法更加高效。 #### 七、总结 优化 Hibernate 的性能涉及到多个方面,包括数据库...
本文将深入探讨Hibernate中的一些重要方法及其调用,包括get()、load()、list()、iterator()以及HQL查询的相关知识点。 1. get()与load()方法: - get()方法:当尝试获取一个对象时,get()首先会在一级缓存中查找...
为了进一步提高Hibernate的性能,可以考虑使用Hibernate提供的二级缓存功能。当应用程序需要频繁访问相同的数据集时,使用缓存可以显著降低数据库的压力并提高响应速度。通过配置合适的缓存策略,可以在不牺牲内存的...
- `get()`和`load()`方法:`load()`使用二级缓存,而`get()`在一级缓存未命中时直接查询数据库。如果对象已缓存,使用`load()`更优。 - `list()`和`iterator()`方法: - `list()`一次性执行查询并返回结果,通常...
3. **Session的load/get方法选择**:load方法会检查二级缓存,而get方法则直接查询数据库。根据实际情况选择合适的方法可以提升性能。 #### 五、主配置参数优化 1. **查询缓存的合理使用**:虽然查询缓存可以加快...
在每次更新后调用`session.flush()`强制Hibernate执行当前的数据库操作,然后使用`session.evict(entity)`将实体从缓存中移除。这样做可以确保每个更新操作仅执行一次,并且避免了持久化上下文中的内存浪费。 ```...
- **使用缓存**:为了提高性能,可以在应用程序中使用 Hibernate 的二级缓存机制来存储查询结果。 - **分页查询**:在大量数据的场景下,使用分页查询可以有效减轻服务器负担。 - **查询优化**:合理地设计表结构和...
8. **缓存**:Hibernate提供了二级缓存机制,可以提高数据读取速度。如果需要,可以配置缓存插件,如Ehcache。 9. **结果集处理**:查询结果通常返回`List`或`Iterator`,可以遍历并转换为自定义的Java对象。 在这...