gpt4 book ai didi

java - Hibernate 即使在缓存命中时也会抛出查询

转载 作者:行者123 更新时间:2023-11-29 03:24:09 25 4
gpt4 key购买 nike

我不确定这是一个真正的问题还是只是配置问题,但我可以在我的日志控制台上看到 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>

而我一遍又一遍地看到...

Hibernate: select city0_.ID as ID2_, city0_.CREATED as CREATED2_, city0_.CREATOR as CREATOR2_, city0_.MODIFIED as MODIFIED2_, city0_.MODIFIER as MODIFIER2_, city0_.NAME as NAME2_, city0_.state_fk as state7_2_ from city city0_ where State_fk=?

hibernate 真的会影响 DB 吗?任何人都可以向我解释一下吗?

我正在使用:

JPA 2.0 in Spring Data JPA 1.2.0

Ehcache 2.6.0

Spring 3.2.1

最佳答案

你启用的是二级缓存。此缓存缓存实体的状态,并通过它们的 ID 对它们进行索引。就像一个 Map<ID, EntityState> .此缓存仅在您通过 ID 获取实体时使用:

  • 通过调用 session.get()
  • 通过调用 session.load()
  • 通过以实体为目标的 XxxToOne 关联导航

您的查询不属于此类别:它通过其字段之一而不是其 ID 查找您的实体。

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

但是,您也可以缓存查询结果。您需要启用查询缓存才能执行此操作,并且 mark your query as cacheable .您还可以缓存关联(这似乎是此查询的原因:它正在寻找给定州的所有城市)。您必须用 @Cache 注释关联.

阅读the documentation .

关于java - Hibernate 即使在缓存命中时也会抛出查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21969197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com