本文章是比较肤浅的hibernate缓存理解,缓存使用的不好会造成1+N查询的问题,会很浪费数据库资源。缓存不提倡什么方法都使用,我觉得只有真正需要的地方才少量使用比较适合。
最近在检查hibernate的HQL语句,发现我使用的hibernate的缓存查询方法出现了奇怪的问题。
我的缓存查询方法核心代码如下:
session.setCacheMode(CacheMode.NORMAL);//hibernate的session
Query q = session.createQuery(hql);//hibernate的query
q.setCacheable(true);//设置使用缓存,默认不使用
这样每次调用该方法进行查询时就会使用缓存(如果你的po配置了缓存的话)
我使用hibernate的2表关联查询 from a,b where a.id=b.id and a.type=?
我的mapping文件中,我的a对象的mapping定义了
<cache usage="read-write" />
而b则没有,结果第一次查询语句输出没什么问题,但是第二次开始,后台的输出每次刷新页面都会有类似:
select b.id,b.name.b.age ..... from b where b.id=?
这样的语句输出。我觉得很奇怪,以为语句出问题了,因为要输出语句应该也是输出2表关联查询的语句才对,怎么单独出现查询其中一个表的sql语句呢?难道我的多表关联查询没作用??后来我把缓存的使用关闭,也就是
q.setCacheable(false);//不使用缓存
这样测试,控制台输出的都是关联2个表查询的sql语句,这样说来关联查询是正常使用的,而一旦使用了缓存,则只会出现一个表单独再查的情况。后来仔细分析发现原来开启了缓存查询,而没有把被查询的对象po设置
<cache usage="read-write" />
hibernate 就会不断的从数据库查询对象。后来我把b的mapping也加上了
<cache usage="read-write" />
就不再出现单查b的语句了,因为都有缓存了。直接从缓存中读取数据,直到缓存消失。
分享到:
相关推荐
如果启用查询缓存,还需添加`hibernate.cache.use_query_cache=true`。 二级缓存将数据视为一个Map,Key通常是实体的ID,Value是对应的实体对象。对于实体的读取,无论是通过list、load还是iterate,只要读取到一个...
Hibernate的Query缓存策略实现** 在执行`Query.list`查询时,Hibernate会创建一个Query Key,包括SQL语句、查询参数和分页条件。如果在缓存中找到匹配的Query Key,它将直接返回缓存的结果列表,否则会从数据库中...
总的来说,Hibernate的查询缓存是提高应用程序性能的重要手段,但需要根据具体业务场景合理使用,并注意其可能带来的数据一致性问题。同时,理解并熟练运用各种查询方式,能帮助开发者更高效地进行数据库操作。
`hibernate.cache.use_query_cache`和`hibernate.cache.use_second_level_cache`分别开启了查询缓存和二级缓存。最后,通过`class-cache`元素配置了`EntityClass`的缓存策略,这里使用了"read-write",表示读写操作...
当一个实体对象被加载到`Session`中时,该对象会被存储在一级缓存中,这样在同一个`Session`生命周期内再次请求同一对象时,Hibernate将直接从缓存中获取,而不是查询数据库。这大大减少了数据库操作的次数,从而...
1. **Query.setFirstResult() 和 Query.setMaxResults()**:这是Hibernate原生的分页方式,`setFirstResult()` 设置从第几个结果开始,`setMaxResults()` 设置最多返回多少个结果。 2. **Criteria API的createAlias...
通过 `@NamedQuery` 或 `@SqlQuery` 注解定义的查询可以设置缓存。 6. **性能调优**:根据实际应用需求和性能测试结果,调整缓存大小、过期策略等参数,以达到最佳性能。 这个"hibernate5.1二级缓存包"可能包含了...
HQL(Hibernate Query Language)是Hibernate提供的面向对象的查询语言,它支持多种连接查询类型,如内连接、迫切内连接、隐式内连接、左外连接、迫切左外连接、右外连接和交叉连接,提供了与SQL类似的查询功能。...
Hibernate 是一个流行的对象关系映射(ORM)框架,它允许Java...通过理解Hibernate缓存和事务管理,以及如何有效地执行查询,开发者可以创建高效、健壮的Java应用程序,降低与数据库交互的复杂性,同时提升系统性能。
Hibernate 的二级缓存是一种用于存储实体和集合查询结果的缓存层,它可以跨多个会话保持数据的有效性。通过使用二级缓存,可以显著提高应用性能,尤其是在频繁查询相同数据的情况下。 #### 三、配置与实现 **1. ...
除了实体缓存,Hibernate还提供了查询缓存(QueryCache),用于缓存查询结果。查询缓存能够存储查询的标识以及对应的对象ID和类型。这样,当再次执行相同的查询时,Hibernate可以直接从缓存中获取结果,而不需要重新...
但是,可以通过设置`hibernate.cache.use_query_cache`来禁用查询缓存,防止对一级缓存造成影响。 ### 二级缓存 二级缓存是SessionFactory级别的,可以跨Session共享。相比一级缓存,二级缓存可以持久化存储,即使...
Hibernate Query Language(HQL)是Hibernate框架中用于操作对象关系映射(ORM)的一种查询语言。它是面向对象的,设计目的是让开发人员可以使用对象而不是数据库表进行查询,从而简化了与数据库交互的过程。HQL的...
二级缓存可以大大提高数据读取速度,因为一旦数据被加载到缓存中,后续的相同查询就可以直接从内存中获取,而不是每次都去数据库查询。 为了在SSH框架中启用Hibernate的二级缓存,你需要做以下几步: 1. **配置...
- **查询缓存**:若要使用查询缓存,还需要额外配置`hibernate.cache.use_query_cache`为`true`。 #### 三、二级缓存的工作原理 ##### 1. 缓存机制 - **Class缓存**:针对实体类的缓存,每个实体类都需要单独配置...
同时,如果要开启查询缓存,还需设置`hibernate.cache.use_query_cache=true`。 在二级缓存中,数据以Map的形式存储,Key通常为对象的ID,Value为对象实例。对于Class级别的缓存,当我们通过ID获取对象时,会首先...