1

grailsサービスでスコープされたehcacheセッションを使用したい。

config/resources.groovyにこの定義のキャッシュBeanを含めることができました

myCache(org.springframework.cache.ehcache.EhCacheFactoryBean) {
      timeToIdle = 5000 // life span in seconds
      timeToLive = 5000 // life span in seconds
      }

ただし、ファクトリから取得したオブジェクトはシングルトンスコープです。

セッションスコープのサービスでセッションスコープのehcacheを使用するための最良の方法は何ですか?

ありがとうございました

4

1 に答える 1

2

キャッシュマネージャーは名前でキャッシュを維持し、名前ごとに1つのキャッシュしか存在できないため、Ehcacheではそれを行うことはできません。一意の名前を強制しないか、キャッシュマネージャーの「キー」として名前を使用しない別のキャッシュ実装を使用する必要があります。

編集:このアプローチは機能しますが、ファクトリBeanを使用しません:

import java.util.concurrent.atomic.AtomicInteger

import net.sf.ehcache.Cache
import net.sf.ehcache.CacheManager
import net.sf.ehcache.store.MemoryStoreEvictionPolicy

import org.springframework.beans.factory.DisposableBean
import org.springframework.beans.factory.InitializingBean

class MyService implements InitializingBean, DisposableBean {

   private static AtomicInteger counter = new AtomicInteger()

   private Cache cache
   private String cacheName

   static scope = 'session'

   void afterPropertiesSet() {

      int maxElementsInMemory = 10000
      int maxElementsOnDisk = 10000000
      MemoryStoreEvictionPolicy memoryStoreEvictionPolicy = MemoryStoreEvictionPolicy.LRU
      boolean overflowToDisk = true
      boolean eternal = false
      int timeToLive = 5000 // 120
      int timeToIdle = 5000 // 120
      boolean diskPersistent = false
      int diskExpiryThreadIntervalSeconds = 120
      int diskSpoolBufferSize = 0

      cacheName = 'myservice-cache-' + counter.incrementAndGet()

      cache = new Cache(cacheName, maxElementsInMemory, memoryStoreEvictionPolicy,
                  overflowToDisk, null, eternal, timeToLive, timeToIdle,
                  diskPersistent, diskExpiryThreadIntervalSeconds, null,
                  null, maxElementsOnDisk, diskSpoolBufferSize)

      CacheManager.getInstance().addCache cache
   }

   void destroy() {
      cache.removeAll()
      CacheManager.getInstance().removeCache(cacheName)
   }
}

サービスはセッションスコープであるため、キャッシュはサービスによって完全に制御されるため、キャッシュである必要はありません。を実装InitializingBeanすることにより、セッションの開始時にキャッシュを作成し、を実装することでセッションの終了時にキャッシュを削除できますDisposableBean。別のキャッシュ名アプローチを自由に使用してください。これは、それらが一意であることを保証するだけです。また、のデフォルトに基づいてキャッシュコンストラクターの値を列挙しましたEhCacheFactoryBeanが、それらはインライン化できます。

于 2012-12-04T16:03:53.583 に答える