Java Hibernate甚至在缓存命中时抛出查询

Java Hibernate甚至在缓存命中时抛出查询,java,spring,hibernate,jpa,ehcache,Java,Spring,Hibernate,Jpa,Ehcache,我不确定这是否是一个真正的问题,或者这只是一个配置问题,但我可以在我的日志控制台上看到hibernate如何命中或至少在命中缓存时抛出select查询 我已经检查了Ehcache监视器上的缓存是否正常工作,它为某个请求注册了100%的命中率。但我总是在日志中看到查询 所有实体的描述如下所示: @Entity @Cacheable @Cache(usage = READ_WRITE) @Table(name = "city") //@NamedQuery(name = "city.findById

我不确定这是否是一个真正的问题,或者这只是一个配置问题,但我可以在我的日志控制台上看到hibernate如何命中或至少在命中缓存时抛出select查询

我已经检查了Ehcache监视器上的缓存是否正常工作,它为某个请求注册了100%的命中率。但我总是在日志中看到查询

所有实体的描述如下所示:

@Entity
@Cacheable
@Cache(usage = READ_WRITE)
@Table(name = "city")
//@NamedQuery(name = "city.findById", query = "from City where ID = :id")
public class City extends Audit implements Serializable {
我的ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
    dynamicConfig="true" monitoring="autodetect">

    <!-- Location of persistent caches on disk -->
    <diskStore path="java.io.tmpdir/MxlServiceLayer" />

    <cacheManagerPeerListenerFactory
        class="org.terracotta.ehcachedx.monitor.probe.ProbePeerListenerFactory"
        properties="monitorAddress=localhost, monitorPort=9889, memoryMeasurement=true" />
    <defaultCache eternal="false" maxElementsInMemory="1000"
        overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
        timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU" statistics="true" />
    <cache name="authToken" eternal="false" maxElementsInMemory="100"
        overflowToDisk="false" diskPersistent="true" timeToIdleSeconds="0"
        timeToLiveSeconds="31536000" memoryStoreEvictionPolicy="LRU"
        statistics="true" />
</ehcache>
我一次又一次地在我的脑海里看到

休眠:选择city0.ID作为ID2,选择city0.ID作为CREATED2, 城市0。创建者作为创建者2,城市0。修改为修改的2, 城市0。修饰符为修饰符2,城市0。名称为名称2,城市0。状态为fk 作为州7_2_来自城市0_其中州_fk=

hibernate真的会影响数据库吗?谁能给我解释一下吗

我正在使用:

Spring数据中的JPA2.0 JPA1.2.0

Ehcache 2.6.0

春季3.2.1


您启用的是二级缓存。这个缓存缓存实体的状态,并根据它们的ID对它们进行索引。它就像一个映射。只有通过ID获取实体时,才会使用此缓存:

通过调用session.get 通过调用session.load 通过以实体为目标的XxxToOne关联进行导航 您的查询不属于此类别:它根据实体的某个字段而不是ID查找实体

对于其余部分,Hibernate不能对缓存执行任意SQL查询,即使可以,缓存也只包含表的一个子集,因此它必须查询数据库

但是,您也可以缓存查询的结果。您将需要启用查询缓存来执行此操作,并执行以下操作。您还可以缓存一个关联,这似乎是此查询的原因:它查找给定州的所有城市。您必须用@Cache注释关联


读取。

您启用的是二级缓存。这个缓存缓存实体的状态,并根据它们的ID对它们进行索引。它就像一个映射。只有通过ID获取实体时,才会使用此缓存:

通过调用session.get 通过调用session.load 通过以实体为目标的XxxToOne关联进行导航 您的查询不属于此类别:它根据实体的某个字段而不是ID查找实体

对于其余部分,Hibernate不能对缓存执行任意SQL查询,即使可以,缓存也只包含表的一个子集,因此它必须查询数据库

但是,您也可以缓存查询的结果。您将需要启用查询缓存来执行此操作,并执行以下操作。您还可以缓存一个关联,这似乎是此查询的原因:它查找给定州的所有城市。您必须用@Cache注释关联


阅读。

您的方法似乎是正确的,但因为我使用的是Spring Data的JPA,所以它目前还不支持查询缓存。@AminAbu Taleb即使在Spring Data JPA中,您也可以告诉我们使用QueryHint来使用hibernate查询缓存。您的方法似乎是正确的,但因为我使用的是Spring Data的JPA,到目前为止,它不支持查询缓存。@即使在spring数据jpa中,您也可以告诉我们使用QueryHint使用hibernate查询缓存。