1.默认情况下,list不会利用一级缓存,iterator会利用一级缓存。
2.list取出来的集合放在session中,在session中的list集合中存放的是对象,而在iterator中存放的只是对象的id,当要取对象时才会发对应的hql语句,当第二次从iterator取对象时,hibernate会先从session缓存中查找.而list不会去session缓存查找,直接查数据库。对于这样的原因很简单,因为list存的是对象,而我们又不能保证每次的查询条件一样,所以只能重新查数据库,然后再刷新缓存;对于iterator就不一样了,它存的是对象的id,只有真正用到时才会发hql语名,然后和id和对应的对象关联,下次如果我们要用到时就可以利用id,先去缓存中查找.(List也可以利用缓存的,前后的查询条件一样--设置查询缓存)
3.例子:
model:和hibernate N+1部题的一样
测试:
@Test
public void testQueryList() {
Session session = sf.openSession();
session.beginTransaction();
//List<Topic> topics = (List<Topic>)session.createCriteria(Topic.class).list();
List<Category> categories = (List<Category>)session.createQuery("from Category").list();
for(Category c : categories) {
System.out.println(c.getName());
}
List<Category> categories2 = (List<Category>)session.createQuery("from Category").list();
for(Category c : categories2) {
System.out.println(c.getName());
}
session.getTransaction().commit();
session.close();
}
@Test
public void testQueryIterate() {
Session session = sf.openSession();
session.beginTransaction();
//List<Topic> topics = (List<Topic>)session.createCriteria(Topic.class).list();
Iterator<Category> categories = (Iterator<Category>)session.createQuery("from Category").iterate();
while(categories.hasNext()) {
Category c = categories.next();
System.out.println(c.getName());
}
Iterator<Category> categories2 = (Iterator<Category>)session.createQuery("from Category").iterate();
while(categories2.hasNext()) {
Category c = categories2.next();
System.out.println(c.getName());
}
session.getTransaction().commit();
session.close();
}
分享到:
相关推荐
2. **迭代器(Iterator)**:使用`iterator`方法查询时,Hibernate同样会先尝试从缓存中获取结果,如果缓存中没有,则执行SQL查询并将结果返回。 3. **负载(Load/Get)**:`load`和`get`方法用于加载实体对象,其中...
其中,`<property name="hibernate.cache.use_query_cache">true</property>`这一配置用于启用查询缓存,意味着通过findall()、list()、Iterator()、createCriteria()、createQuery()等方法获取的数据结果集会被缓存...
当执行诸如save、saveOrUpdate、get、load、list或iterator等方法时,Hibernate会自动将对象放入一级缓存。用户无法直接操作一级缓存内容,但可以通过flush()、evict()和clear()方法间接管理。flush()用于使缓存与...
- **5.2 `Query`的`list`与`iterator`方法** - **`list`方法**: - 直接查询数据库并返回结果集。 - 不利用缓存机制。 - **`iterator`方法**: - 将查询结果保存在缓存中。 - 支持迭代器访问方式,有助于提高...
例如,如果在没有启用查询缓存时,使用`load()`方法获取的单个持久化对象会被缓存,但若想缓存`findAll()`, `list()`, `Iterator()`, `createQuery()`, `createCriteria()`等方法获取的结果集,必须设置`hibernate....
《Hibernate难点解析与...理解并灵活运用uuid、get()与load()以及iterator()和list()的区别,是每个Hibernate开发者必备的技能。通过深入学习这些难点,开发者能够更好地驾驭Hibernate,从而提升项目的稳定性和性能。
然而,在实际应用中,不少开发者遇到了性能问题:使用Hibernate实现的功能与直接使用JDBC相比,性能差距明显。如果不及时解决这些问题,可能会严重影响项目的进度。 #### 二、数据库设计调整 1. **降低关联复杂性*...
3. **Query 和 list/iterator**:list 仅利用查询缓存,而 iterator 可以利用二级缓存。iterator 在处理大量数据时更为高效,因为它可以逐条加载数据并释放内存。 #### 八、总结 Hibernate 性能调优涉及多个层面,...
例如,如果设置了`default-cascade="all"`,那么在保存或更新一个实体时,Hibernate会自动更新与该实体相关的所有关联对象的状态。这样不仅可以简化代码,还可以确保数据的一致性。 #### 七、监控并调整Hibernate的...
1. **Hibernate配置**:首先,你需要了解Hibernate的配置文件(hibernate.cfg.xml),其中包含了数据库连接信息、方言设置、缓存策略等关键配置。理解这些参数如何影响Hibernate的性能和行为至关重要。 2. **实体类...
for (Iterator iter = list.iterator(); iter.hasNext();) { Classes classes = (Classes) iter.next(); System.out.println("class's name=" + classes.getName()); for (Iterator iter1 = classes.getStudents...
Hibernate 是一个基于 Java 的 ORM(Object-Relation Mapping)框架,允许开发者使用面向对象的方式与关系数据库交互。在本文中,我们将对 Hibernate 的源码进行深入分析,并探讨其核心特性和技术实现。 架构 ...
本文档基于魔乐科技李兴华老师的 Hibernate 教程笔记进行整理与扩展,主要介绍了 Hibernate 的数据检索方法,特别是 HQL(Hibernate Query Language)的使用技巧。 #### 二、HQL 基础 HQL 是一种面向对象的查询语言...
在Java Web开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的交互。Struts是MVC(模型-视图-控制器)框架,用于处理HTTP请求,而JSP(JavaServer Pages)则用于创建动态网页。...
- **Query执行方式**:根据查询结果大小和应用需求,选择list或iterator执行方式,避免内存溢出问题。 #### 7. 集合性能理解 深入理解Hibernate集合的内部机制,如《Understanding Collection performance》章节所...
3. **Query 和 list/iterator**:list 方法仅利用查询缓存,而 iterator 方法可以利用二级缓存。在进行大量数据查询时,iterator 方法更加高效。 #### 七、总结 优化 Hibernate 的性能涉及到多个方面,包括数据库...
总之,优化Hibernate性能涉及多个层面,包括数据库设计、代码结构、配置参数、缓存策略等,需要结合实际情况综合考虑,持续监控和调整以达到最佳效果。在实践中,应不断学习和探索,以提升系统的整体性能。
总的来说,Hibernate通过对象关系映射解决了Java应用程序与关系数据库之间的交互问题,降低了开发难度,提高了开发效率,是现代Java企业级应用开发中的重要工具。在面试中,对这些知识点的深入理解与熟练运用,是...
为解决这些问题,Hibernate 3引入了HQL(Hibernate Query Language)来支持批量更新和删除。例如,要删除所有User对象,只需执行HQL语句`delete User`,然后调用`Query.executeUpdate()`方法。这种方式与直接使用...