2011-10-09 17 views
6

En mi proyecto estoy usando ehcache para almacenar detalles del usuario y otra información (qué aplicación usará esto en tiempo de ejecución en lugar de ir a buscar desde db). La siguiente es la configuración de mi ehcache:WebApp Session Management usando Ehcache

<cache 
    name="normalCache" 
    maxElementsInMemory="50000" 
    eternal="false" 
    timeToIdleSeconds="1800" 
    timeToLiveSeconds="0" 
    overflowToDisk="false" 
    memoryStoreEvictionPolicy="LRU" 
/> 

pero el problema es la mayor parte del tiempo de espera de sesión de tiempo pasando (aunque usuario no está inactivo más> 30). A veces ocurre durante 10 minutos, ...

Todas las acciones intentarán recuperar el objeto de usuario por cada solicitud desde la memoria caché electrónica.

No estoy seguro de cómo ehcache determinará el tiempo de caducidad.

+0

Hola Ramki También estoy tratando para implementar ehcache puedes tener alguna buena guía o tutorial para el mismo si es así, por favor proporcione el enlace de la misma. –

+0

Hola, ¿qué servidor de aplicaciones estás usando? –

Respuesta

1

ehcache no garantiza que guarde todos sus elementos durante 30 minutos.

En su configuración, tiene un maxElementsInMemory de 50000. Tal vez haya alcanzado en algún momento el 50000 y, por lo tanto, la entrada Usado menos recientemente será desalojada, ya que ha configurado overflowToDisk en falso.

5

Ehcache desaloja objetos de la caché cuando una de las siguientes condiciones:

  1. objeto no ha sido visitada desde ehcache (lectura o actualizado) durante más de timeToIdle segundos. Esta regla no se aplica si timeToIdle no está configurado. En otras palabras, un objeto está calificado para permanecer en la memoria caché durante un tiempo infinito, incluso si nunca se accede (lee o actualiza) desde la memoria caché cuando timeToIdle no está configurado.

  2. El objeto ha estado en el caché durante más de timeToLive segundos. Esta regla no se aplica si timeToLive no está configurado. En otras palabras, un objeto está calificado para permanecer en la memoria caché por tiempo infinito.

  3. El número de elementos en la memoria caché ha alcanzado el límite de maxElementsInMemory. En ese caso, memoryStoreEvictionPolicy entra en acción y elimina los elementos que coinciden con la política de desalojo hasta que el número de elementos en la memoria caché sea inferior al límite maxElementsInMemory, aunque esos elementos están calificados para estar en la memoria caché según las condiciones N.º 1 y Nº 2

Espero que lo aclare!

0

Preámbulo

que está planeando utilizar como una aplicación Ehcache primer cheque de gestión de sesiones, si no se puede utilizar, por casualidad, una implementación sesión ya proporcionada, y probablemente más apropiado. Si está utilizando un contenedor web o un servidor completo Jee descarnada realmente debería probar esta primera


Por qué

bien. Está seguro de que no lo hará de la manera más fácil. Aquí hay algunos consejos, por qué es posible que desee utilizar ehCache para las sesiones

  1. Su servicio no forma parte de un servidor jee/contenedor web.
  2. Su servicio no tiene estado, pero de vez en cuando necesita estados (código de marco).
  3. No puede distinguir llamadas debido a un proxy entre usted y el cliente distinguible, por ejemplo, usted es un tipo de middleware para un servicio/servicio que no proporciona datos distinguibles por defecto, pero utiliza parámetros como userId o sessionId condicionalmente pero no constitutivamente .
  4. Usted simplemente no hizo RTFM y quiere hacerlo a su manera.

Para 1, compruebe si un contenedor web como el muelle es una opción. Ciertamente usas el acceso web de toda la sesión que no aparecería para ti.

Para 2 compruebe, si Apache Shiro no hará lo que quiera. Si no, ehCache podría ser tu amigo.

Para 3 ... Bienvenido al club.

Para 4 ... bueno, supongo que si no leyó el manual, tampoco lo leerá.


Cómo

Si desea implementar una gestión de sesiones utilizando Ehcache favor asegurar que sus datos es serializable. Esto reducirá los problemas y le permitirá usar las funciones confidenciales de ehCache. a saber, la persistencia en el disco, los nodos de almacenamiento en caché, la recuperación de esto, y así sucesivamente.

Do no utilizar una memoria caché para cada sesión, pero uno caché para todas las sesiones. El sessionId es la clave en su caché, y los valores van a un Map. No te olvides de la simultaneidad (piensa en llamadas ajax). Puede ser mejor usar el ConcurrentHashMap desde java.util.concurrent. Pero tal vez sea Dr Heinz M. Kabutz y encuentre una forma aún más genial de hacerlo.

Me pareció muy útil utilizar el tamaño en lugar de la cantidad de elementos para mantener en el almacenamiento. Es posible que no sepa qué datos/objetos se almacenan más adelante. No te olvides de establecer una estrategia de persistencia. Utilicé el almacenamiento de la carpeta temporal aquí.

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

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

    <cache name="vocCache" 
     eternal="false" 
     maxElementsInMemory="100MB" 
     maxElementsOnDisk="1GB" 
    timeToIdleSeconds="3600" 
    timeToLiveSeconds="0" 
    memoryStoreEvictionPolicy="LRU" 
    diskExpiryThreadIntervalSeconds="60"> 
    <persistence strategy="localTempSwap" /> 
</cache> 

Porque queremos implementar un gestor de sesiones, no nos molestamos sobre timeToLiveSeconds. Sesiones de tiempo de espera después de un cierto tiempo de inactividad. Por lo tanto, no restringimos el elemento a un ttl máximo, sino que usamos el timeToIdleSeconds para dejar que un elemento expire. No se moleste con timeToIdleSeconds y timeToLiveSeconds porque puede establecer valores específicos a los elementos para agregarlos más adelante.

desalojo

Una nota en el tiempo de expiración. Un elemento en la memoria nunca será desalojado debido a un tiempo configurado. La memoria se acumulará hasta que se golpee la restricción de memoria definida. Por lo tanto, si define 100 elementos, si se agrega el elemento 101, se activará el memoryStoreEvictionPolicy y se vaciará un elemento (en esta configuración) en el disco (ehCache 2.2). Para el almacenamiento en disco, habrá un hilo que compruebe el tiempo de caducidad (diskExpiryThreadIntervalSeconds). Vea el documentation. Por lo tanto, debe verificar el elemento recuperado de la memoria caché usando isExpired() para asegurarse de que no ha expirado.


Así que al final, el resultado final será con algo como esto:

GET

Cache cache = CacheManager.getInstance().getCache(CACHE_NAME); 
Element elem = cache.get(identifier); 
if (elem == null) 
{ 
    throw new SessionNotFoundException(identifier); 
} 
if (elem.isExpired()) 
{ 
    throw new SessionExpiredException(identifier); 
} 

return elem.getObjectValue(); 

PUT

Cache cache = CacheManager.getInstance().getCache(CACHE_NAME); 
// We use ttl = 0 and tti=<ttlInMinutes>, because session timeout is based on session idle timout. 
element = new Element(identifier, new SessionElement(), Boolean.FALSE, (int) (timeToLive/VALUE_MS), 0); 
cache.put(element);