2014-02-23 74 views
1

我不知道這是否是一個真正的問題,或者它只是配置的問題,但我可以在我的日誌控制檯上看到休眠命中(或至少拋出select查詢)即使在高速緩存命中。休眠拋出查詢甚至在緩存命中

我檢查緩存工作正常的Ehcache顯示器上,它一定要求登記命中100%。但我總是看到日誌中的查詢。

所有實體anotated如圖所示:

@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_.CREATED作爲CREATED2_, city0_.CREATOR作爲CREATOR2_,city0_.MODIFIED作爲MODIFIED2_, city0_.MODIFIER as MODIFIER2_,city0_.NAME as NAME2_,city0_.state_fk as state7_2_ from city city0_ where State_fk =?

是冬眠真的擊中DB?任何人都可以向我解釋這一點嗎?

我使用:

JPA 2.0在Spring數據JPA 1.2.0

的Ehcache 2.6.0

春3.2.1

回答

4

啓用了什麼是二級緩存。該緩存緩存實體的狀態,並通過它們的ID將它們編入索引。這就像一個Map<ID, EntityState>。通過一個XxxToOne協會導航瞄準實體

  • 通過調用session.get()
  • 通過調用session.load()
  • :如果獲得ID的實體此高速緩存僅用於

您的查詢不屬於這一類:它看起來對你的實體通過它的領域之一,而不是它的ID。

對於剩下的,Hibernate無法對緩存執行任意SQL查詢,即使它可能,緩存只包含表的一個子集,因此它來查詢數據庫。

但是,您也可以緩存查詢的結果。您需要啓用查詢緩存才能這樣做,並且需要mark your query as cacheable。你也可以緩存一個關聯(這看起來是這個查詢的原因:它正在尋找給定狀態的所有城市)。你必須註明與@Cache的關聯。

閱讀the documentation

+0

你的方法似乎是正確的,但因爲我使用Spring Data的JPA,所以它目前不支持查詢緩存。 –

+0

@ AminAbu-Taleb即使在spring數據jpa中,也可以使用QueryHint來告訴使用hibernate查詢緩存。 – FranXho