2013-08-01 44 views
2

我有一個使用多種方法的服務,並試圖使用Spring @Cacheable註釋來緩存它們。一切正常,除非我發現數組作爲方法參數的方法沒有被緩存。考慮到數組可以具有不同的值,這有點合理,但我仍然認爲這是可能的。在Spring中使用數組參數的方法進行緩存

以下方法緩存:

@Cacheable("myCache") 
public Collection<Building> findBuildingByCode(String buildingCode) {...} 

@Cacheable("myCache") 
public Collection<Building> getBuildings() {...} 

但是,如果我改變findBuildingByCode方法要麼以下的,它是不緩存:

@Cacheable("myCache") 
public Collection<Building> findBuildingByCode(String[] buildingCode) {...} 

@Cacheable("myCache") 
public Collection<Building> findBuildingByCode(String... buildingCode) {...} 

下面是相關的Spring XML配置:

<!-- Cache beans --> 
<cache:annotation-driven/> 

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" 
    p:cache-manager-ref="ehcache" /> 

<!-- EhCache library setup --> 
<bean id="ehcache" 
    class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" /> 

的Ehcache配置:

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

<diskStore path="java.io.tmpdir/ehcache" /> 

<!-- Default settings --> 
<defaultCache eternal="false" maxElementsInMemory="1" 
    overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0" 
    timeToLiveSeconds="100" memoryStoreEvictionPolicy="LRU" /> 

<!-- Other caches --> 

<cache name="myCache" eternal="false" maxElementsInMemory="500" 
    overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0" 
    timeToLiveSeconds="43200" memoryStoreEvictionPolicy="LRU" /> 

</ehcache> 

這是已知的功能或錯誤?

回答

4

嘗試定義這樣的緩存鍵:

@Cacheable(value="myCache", key="#buildingCode.toString()") 

或者#buildingCode.hashCode()。所以緩存管理器將能夠緩存該方法。

+1

如何像arrayList hashMap集合? – happyyangyuan

+0

可以請你回答這個https://stackoverflow.com/questions/46936689/how-to-write-spring-eh-cache-key-spelexpression-expression-properly-when-the-m – Sanka

1

對數組使用散列或字符串表示形式沒有定義緩存方面的唯一性。例如,數組包含2個或更多相同的條目或具有不同的順序:散列/ toString將會不同......但緩存鍵應該可能是相同的。 我會做的是建立在你的數組的包裝...並創建一個getCacheKey(),將做任何你需要做的......上面

public class BuildCodesCacheWrapper { 
private String[] buildingCodes; 

private BuildCodesCacheWrapper(String[] buildingCodes) { 
    super(); 
    this.buildingCodes = buildingCodes; 
} 

public String getCacheKey(){ 
    String key = ""; 
    if(null != buildingCodes){ 
     for(String code : buildingCodes){ 
      if(!key.contains("")){ 
       key += code; 
      } 
     } 
    } 
    return key; 
} 
} 

(代碼沒有測試,還可以更爲通用於所有類型的陣列等...)

,並使用該getCacheKey()在SPEL表達的方法...

@Cacheable( 「myCache」,鍵= 「#buildingCode.getCacheKey()」 ) public Collection findBuildingByCode(BuildCodesCacheWrapper buildingCode){...}

+0

你可以使用SortedSet insteaf的陣列,以便您擺脫重複和訂購問題。 – Alin

相關問題