当开始<prop key="hibernate.cache.use_query_cache">true</prop> 查询缓存时。
但是又把
<prop key="hibernate.cache.use_second_level_cache">false</prop>二级缓存关闭时。
出现了1+N的问题。
比如 select * from A c where c.name like ? ;
第一次查询了只发了一条sql。
当第二次查询时就根据id,挨个去数据库里面查询了。
对于查询缓存来说,缓存的key是根据hql生成的sql,再加上参数,分页等信息(可以通过日志输出看到,不过它的输出不是很可读,最好改一下它的代码)。
比如hql:
from Cat c where c.name like ?
生成大致如下的sql:
select * from cat c where c.name like ?
参数是"tiger%",那么查询缓存的key*大约*是这样的字符串(我是凭记忆写的,并不精确,不过看了也该明白了):
select * from cat c where c.name like ? , parameter:tiger%
这样,保证了同样的查询、同样的参数等条件下具有一样的key。
现 在说说缓存的value,如果是list方式的话,value在这里并不是整个结果集,而是查询出来的这一串ID。也就是说,不管是list方法还是 iterate方法,第一次查询的时候,它们的查询方式很它们平时的方式是一样的,list执行一条sql,iterate执行1+N条,多出来的行为是 它们填充了缓存。但是到同样条件第二次查询的时候,就都和iterate的行为一样了,根据缓存的key去缓存里面查到了value,value是一串 id,然后在到class的缓存里面去一个一个的load出来。这样做是为了节约内存。
可以看出来,查询缓存需要打开相关类的class缓存。list和iterate方法第一次执行的时候,都是既填充查询缓存又填充class缓存的。
同条件第一次list的时候,因为查询缓存中找不到,不管class缓存是否存在数据,总是发送一条sql语句到数据库获取全部数据,然后填充查询缓存和 class缓存。但是第二次执行的时候,问题就来了,如果你的class缓存的超时时间比较短,现在class缓存都超时了,但是查询缓存还在,那么 list方法在获取id串以后,将会一个一个去数据库load!因此,class缓存的超时时间一定不能短于查询缓存设置的超时时间!如果还设置了发呆时 间的话,保证class缓存的发呆时间也大于查询的缓存的生存时间。这里还有其他情况,比如class缓存被程序强制evict了,这种情况就请自己注意 了。
相关推荐
在Java开发中,使用Hibernate作为ORM框架时,我们可能会遇到一个性能上的问题,那就是著名的“N+1查询问题”。此问题源于不恰当的数据加载策略,可能导致数据库查询效率低下,尤其在大数据量的情况下,会严重影响...
- 合理设计实体关系,避免N+1查询问题。 - 使用批处理更新和插入,减少数据库交互次数。 通过以上分析,我们可以看出`hibernate-core-5.0.11.Final.jar`在ORM中的重要地位。掌握其源码和应用,对于提升Java开发人员...
本教程聚焦于一个常见问题——"1+N"查询问题,这是Hibernate在处理关联关系时可能出现的性能瓶颈。 在关系型数据库中,我们经常遇到一对多(1:N)的关系,比如一个用户可以有多个订单,一个部门可以有多个员工。在...
A: N+1 查询问题是指在一个查询后,为了获取关联对象而产生了额外的 N 次查询。可以通过以下方式来避免该问题: - **使用 FetchMode.JOIN**:在 hbm.xml 映射文件中,将 fetch 属性设置为 JOIN,或者使用 @Fetch...
2. 选择合适的映射策略:理解懒加载、立即加载和集合的加载策略,避免N+1查询问题。 3. 优化查询:避免在HQL中使用子查询,尽量使用JOIN,合理设置缓存策略。 4. 谨慎使用事务:根据业务需求,正确设置事务隔离级别...
- 优化查询,避免N+1查询和大数据量的加载。 - 考虑使用Criteria API或HQL代替直接的SQL,以保持代码的可读性和移植性。 总结,Hibernate 4.2.19.Final为开发者提供了一个强大的工具,使得Java应用程序与数据库...
包括但不限于:合理使用缓存,避免N+1查询问题,使用批处理更新,选择合适的主键生成策略,以及优化HQL和SQL查询等。 通过深入学习Hibernate 4.1.4.Final的源码,我们可以更好地理解其设计思想,提升我们的编程技巧...
然而,需要注意的是,查询缓存可能引发“n+1”问题。当从查询缓存中获取对象列表时,由于二级缓存关闭,Hibernate无法直接获取完整的对象,只能获取到对象的ID。随后,对于列表中的每个ID,Hibernate会单独查询二级...
- 合理设计实体关系,避免N+1查询问题。 - 优化查询,减少无谓的数据库访问。 10. **集成Spring**: Hibernate与Spring框架集成,可以使用Spring的事务管理,进一步简化代码,提高代码的可维护性。 综上,...
在使用iterate查询时,虽然会将查询到的实体放入缓存,但仍然会产生N+1问题,即发出一条查询ID的SQL,然后根据ID列表逐个查询实体。List()和iterate查询的主要区别在于,List每次都会查询SQL并放入缓存,而iterate在...
5. **查询优化**: 避免N+1查询问题,合理使用JOIN,减少数据库交互次数。 **六、源码分析** `hibernate_test`、`hibernate_test3`、`hibernate_test2`这些文件可能包含了示例项目的源代码,包括配置文件、实体类、...
2. 合理设计实体关系:避免N+1查询问题,优化数据访问性能。 3. 异步处理:通过批处理和异步操作,提高系统的响应速度和吞吐量。 4. 使用JPA 2.2的新特性:如新查询构造器,简化代码并提高代码质量。 总结,...
- 避免N+1查询问题:通过HQL的JOIN子句或Criteria的FetchMode.JOIN获取关联数据。 - 分页查询:使用Query的setFirstResult和setMaxResults方法,减少返回结果量。 通过深入理解Hibernate 4.3.9.Final,开发者可以...
- **缓存机制**:Hibernate 3 内置了二级缓存机制,可以显著提高应用程序的性能。 ### 关于 SQL Server 配置的部分内容解读 在提供的部分内容中,提到了关于 SQL Server 的内存配置问题。这段文字描述了如何调整 ...
而且,iterate可能会导致1+N问题,因为即使有缓存,每次迭代时仍需检查数据库是否存在新数据。相比之下,list在某些情况下可能更高效,特别是当配合查询缓存时。 查询缓存可以存储特定查询的结果,使得相同的查询只...
4. 更强的类型安全:使用JPA 2.1的@NamedEntityGraph,可以在查询时指定加载关联的属性,减少N+1查询问题。 5. 新的API:如SessionFactoryBuilder,提供更灵活的SessionFactory构建方式。 三、主要组件详解 1. ...
1. 合理设计实体关系,避免N+1查询问题。 2. 使用缓存策略来提高性能,但需注意缓存一致性问题。 3. 在事务中进行所有数据库操作,确保数据一致性。 4. 对复杂的查询使用SQL,结合NativeQuery或Hibernate的...
2. **优化查询**:尽量减少大范围查询,避免N+1查询问题,利用HQL或Criteria API编写高效的查询语句。 3. **实体设计**:合理设计实体关系,避免过度复杂的关联导致性能下降。 五、实战应用 在实际项目中,开发者...
例如,合理使用缓存策略,避免N+1查询问题,以及在处理大批量数据时启用批处理等。 6. **实战应用**: 学习Hibernate不仅仅是理论,更需要通过实际项目来提升技能。可以尝试搭建一个简单的CRUD应用,逐步理解和...