2009-02-25 11 views
8

Tengo una colección de estados, que quiero almacenar en caché durante toda la vida de la aplicación, preferiblemente después de que se invoque por primera vez. Estoy usando EclipseLink como mi proveedor de persistencia. En mi entidad EJB3 Tengo el siguiente código:Cómo configurar Caché de consultas en EclipseLink

@Cache 
@NamedQueries({ 
    @NamedQuery(
     name = "State.findAll", 
     query = "SELECT s FROM State s", 
     hints = { 
       @QueryHint(name=QueryHints.CACHE_USAGE, value=CacheUsage.CheckCacheThenDatabase), 
       @QueryHint(name=QueryHints.READ_ONLY, value=HintValues.TRUE) 
      } 
    ) 
}) 

Esto no parece hacer nada, sin embargo, si yo controlo las consultas SQL que van a MySQL todavía lo hace un selecto cada vez que mi bean de sesión utiliza esta NamedQuery.

¿Cuál es la forma correcta de configurar esta consulta para que solo se lea una vez desde la base de datos, preferiblemente en todas las sesiones?

Editar: Estoy llamando a la consulta como la siguiente:

Query query = em.createNamedQuery("State.findAll"); 
List<State> states = query.getResultList(); 
+0

Lo mejor de la suerte para averiguar la configuración de sesión/almacenamiento en caché de EclipseLink. Nunca pude. – cletus

Respuesta

0

Sólo una conjetura aquí, pero usted podría intentar

query.cacheQueryResults(); 

después de crearlo, pero antes de getResultList.

- MarkusQ

+0

¿Puedes explicar cómo funcionaría esto? El objeto Consulta de JPA no es compatible con el método cacheQueryResults(). Si, en cambio, creo un ReadObjectQuery, no sé cómo (o si puedo) pedirle una lista. – rustyshelf

+0

Si no desea utilizar la consulta específica de eclipselink, debe usar sugerencias. Se puede hacer a través de anotaciones, como explicó Andre oa través de query.setHint (QueryHints.QUERY_RESULTS_CACHE, HintValues.TRUE) – Pau

0

llegué EclipseLink 1.0.1 caché para trabajar añadiendo simplemente la sugerencia de consulta:

Query query = em.createNamedQuery("Person.find"); 
query.setParameter("NAME", name);  
query.setHint("eclipselink.cache-usage", "CheckCacheThenDatabase"); 
return (Person)query.getSingleResult(); 

no cambiaba la entidad en absoluto, y sin embargo no lo he probado para configurar el caché usando anotaciones

8

Las soluciones publicadas aquí no funcionaron para mí. Pero lo he hecho funcionar con:

@Cache 
@NamedQueries({@NamedQuery(
     name = "State.findAll", 
     query = "SELECT s FROM State s", 
     hints = { 
      @QueryHint(name = QueryHints.QUERY_RESULTS_CACHE, value = HintValues.TRUE) 
     } 
    )}) 
+0

Exactamente, QueryHints.CACHE_USAGE es para el uso de la memoria caché de segundo nivel. Si desea caché de consultas, la pista que debe usar es, como dijo Andre: QueryHints.QUERY_RESULTS_CACHE – Pau

+0

La anotación '@ Cache' no es necesaria para que la consulta funcione con el caché – Atais

Cuestiones relacionadas