2012-05-15 12 views
5

Tengo un problema con la doctrina. Me gusta el almacenamiento en caché, pero si actualizo una entidad y el color, ¿no debería doctrine2 borrar su caché? De lo contrario, el caché es de muy poca utilidad para mí, ya que este proyecto tiene mucha interacción y, literalmente, siempre tengo que deshabilitar el caché para cada consulta. Los usuarios no verían su interacción si la caché siempre les muestra la versión anterior en caché.Doctrine2 Almacenamiento en caché de los elementos actualizados

¿Hay algún camino a su alrededor?

+0

¿Simplemente desea apagar la caché por completo? Sé que puedes borrar el caché con $ deleted = $ cacheDriver-> deleteAll(); – Gohn67

+0

@ Gohn67: ¿Cómo obtengo el CacheDriver? –

Respuesta

1

Esto es de acuerdo con la documentación en Doctrine2 sobre cómo borrar la caché. Ni siquiera estoy seguro de que esto sea lo que quieres, pero supongo que es algo que debes intentar.

El controlador de caché de Doctrine2 tiene diferentes niveles de eliminación de entradas en caché.

Puede eliminar el ID directa, usando una expresión regular, por sufijo, por prefijo y llana supresión de todos los valores en la memoria caché

Así que para eliminar todo lo que haría:

$deleted = $cacheDriver->deleteAll(); 

Y eliminar por prefijo, que haría:

$deleted = $cacheDriver->deleteByPrefix('users_'); 

no estoy seguro de cómo los nombres Doctrine2 sus identificaciones caché aunque, por lo que tendría que cavar para eso.

información sobre cómo borrar la memoria caché se encuentra aquí: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#deleting

para obtener el controlador de caché, puede hacer lo siguiente. No fue descrito en los documentos, así que simplemente rastreé el código un poco.

Estoy suponiendo que tiene una instancia gestor de la entidad en este ejemplo:

$config = $em->getConfiguration(); //Get an instance of the configuration 
$queryCacheDriver = $config->getQueryCacheImpl(); //Gets Query Cache Driver 
$metadataCacheDriver = $config->getMetadataCacheImpl(); //You probably don't need this one unless the schema changed 

Alternativamente, supongo que se podría guardar la instancia cacheDriver en algún tipo de clase Registry y recuperar de esa manera. Pero depende de tu preferencia. Personalmente trato de no depender demasiado de Registros.

Otra cosa que puede hacer es decirle a la consulta que está ejecutando que no use el caché de resultados. Una vez más, no creo que esto sea lo que quieres, sino simplemente tirarlo por ahí. Principalmente parece que también deberías desactivar el caché de consultas. Eso es a menos que sean solo unas pocas consultas específicas en las que no desee usar el caché.

Este ejemplo es de la documentación: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#result-cache

$query = $em->createQuery('select u from \Entities\User u'); 
$query->useResultCache(false); //Don't use query cache on this query 
$results = $query->getResult(); 
+1

Me pregunto, ¿eliminaron "deleteByPrefix()" en v.2.2.2? Realicé una búsqueda completa en el origen de la doctrina y no se puede encontrar este método –

+0

'deleteByPrefix' no está disponible para el controlador de Memcache. – Sithu

3

¿Estás hablando de guardar y buscar una nueva entidad dentro del mismo tiempo de ejecución (solicitud)? Si es así, debes actualizar la entidad.

$entity = new Entity(); 
$em->persist($entity); 
$em->flush(); 
$em->refresh($entity); 

Si la entidad se maneja y se hacen cambios, éstos se aplicarán a objeto Entity pero sólo persistieron a su base de datos cuando se llama a $ em-> flush().

Si su caché devuelve un conjunto de datos anterior para una solicitud nueva (a pesar de que se actualizó correctamente en la base de datos), parece que ha descubierto un error. Que puede archivar aquí >>http://www.doctrine-project.org/jira/secure/Dashboard.jspa

+0

Intenté exactamente eso. Cargué la entidad, realizo cambios, la conservo, lave y la actualizo. Siempre lo mismo. Pero tal vez eso se deba a que actualizo la entidad y no todos sus objetos relacionados, por lo que los objetos relacionados todavía provienen de la memoria caché. –

+0

cuando dice "cargar" la entidad, ¿quiere decir crearla o recuperarla de la base de datos? Si se va a buscar, está en un estado "administrado" y no necesita usar el método persist() en él. Además, actualizar una entidad administrada podría eliminar cualquier modificación que hayas realizado en ella. Si es nuevo: create -> persist -> flush -> refresh. Si se gestiona (recuperado desde el DB): fetch -> (make changes) -> flush. –

+0

Intenté lo mismo, actualizar no ayuda realmente a "luchar" contra el caché. Funciona de esta manera: $ entity = $ service-> loadCached(); echo $ entity-> getData(); // devuelve datos que se almacenan en caché $ em-> refresh(); echo $ entity-> getData(); // devuelve datos que no están almacenados en caché Lo cual suena bien, pero no invalida la caché real, por lo que en la próxima ejecución de loadCached() aún obtendrá datos antiguos. Parece que no hay otra manera más que borrar el caché manualmente, como sugirió Gohn67. –

3

Doctrine2 no tiene esos métodos de eliminación, tales como deleteByPrefix, que estaba en Doctrine1 en algún momento (hace 3 años) y se retiró, ya que causó más problemas.

La página de http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#deleting está actualizado (la siguiente versión del documento Doctrine2 verá esos métodos retirados). Lo único que puede hacer ahora es administrar manualmente la memoria caché: encuentre la identificación y elimínela manualmente después de cada actualización.

Caché de doctrina más avanzada es WIP: https://github.com/doctrine/doctrine2/pull/580.

+0

Sí, viejo boleto, todavía tengo curiosidad. Estoy buscando "deleteByPrefix", pero no puedo encontrar nada al respecto. ¿Qué tipo de problemas tenía? ¿Problemas de desempeño? Tal vez debería abrir una nueva pregunta sobre eso. – DoppyNL

Cuestiones relacionadas