2009-09-16 12 views
6

¿Qué sucede si tengo una consulta a la que se llama varias veces en un solo hilo, y solo quiero almacenar en caché esa consulta (y su resultado) para ese hilo (o para esa sesión dado que estoy usando una sesión por hilo), Cómo puedo hacer eso ?¿Cómo habilitar la memoria caché de búsqueda de hibernación únicamente en un nivel de sesión?

Nota: Mi segundo nivel de caché está activado pero se usa principalmente para session.get (...). Pero no quiero usarlo para mi caché de consultas porque solo lo necesito para vivir durante la duración de mi hilo (/ sesión).

Gracias

Respuesta

0

No sé de cualquier característica de hibernación.

Pero este parece ser un contexto muy limitado y manejable. Yo trataría de hacer eso es el código. Varias maneras parecen posibles a primera vista:

  • Si su código es bien conocido, la complejidad es manejable. Supongamos que tiene un código A, que llama a los códigos B y C, ambos necesitan la consulta. Puede ejecutar la consulta una vez en A, como pasar el resultado a B y C. ¿Tal vez ya tienes un objeto de contexto que envías a B y C? Eso sería simple, elegante, significativo ...
  • Supongamos lo contrario, que su código es un verdadero desastre, y no puede pasar un contexto. Puede tener una variable ThreadLocal que contenga el resultado. Si no se establece dentro del hilo actual, llámalo y guárdalo. De lo contrario, solo recupéralo.

    Tenga en cuenta que, en el segundo caso, tendrá que encargarse de limpiar el ThreadLocal al salir.

  • Entre estos opuestos, las soluciones son posibles, uno de ellos es probablemente mejor que otros ...

2

almacenamiento en caché de consulta no se puede aplicar a la caché de sesión. Esto tiene sentido, ya que, en general, todas las operaciones contra una sesión se realizan con una sola pieza de código, que debería ser capaz de recordar los resultados.

Dice que no desea habilitar el almacenamiento en caché de consultas de segundo nivel, pero ¿cuál sería el daño al hacerlo? Obtendrás tus resultados deseados.

+0

Debido a http://darren.oldag.net/2009/05/hibernate-wars-query-cache-strikes-back.html y otras advertencias por ahí. Además, realmente no tengo ningún motivo para mantenerlo vivo durante más tiempo que el hilo. –

+0

+1. A continuación, proporcioné algunos detalles sobre cómo limitar la duración de la caché de consultas a la de la sesión (u otra duración de su elección), pero estoy completamente de acuerdo con skaffman; debe tener un caso MUY especial para que esto tenga sentido. – ChssPly76

5

La línea de fondo aquí es: puede guardar manualmente en caché los resultados de su consulta o puede pedirle a Hibernate que lo haga. Aunque por lo general no tiene mucho sentido de restringir la búsqueda de caché de por vida a la de la sesión, se puede hacer utilizando el siguiente enfoque:

1) Enable query cache

2) Dedicar una región específica para la consulta en cuestión y se marca como cacheable:

Query query = ...; 
query.setCacheable(true).setCacheRegion("MY_SPECIAL_QUERY"); 

3) desalojar la consulta de la memoria caché al final de la sesión (si usted es realmente seguro que es lo que quiere hacer):

SessionFactory sessionFactory = ...; 
sessionFactory.evictQueries("MY_SPECIAL_QUERY"); 
Cuestiones relacionadas