2012-02-24 12 views
5

Tenemos una serie de regiones de caché creados en nuestra implementación NHibernate. Para evitar problemas con los servidores web con equilibrio de carga, quiero desactivar efectivamente el almacenamiento en caché en las páginas que editan los datos en caché. Puedo escribir un método que borre todos mis cachés de consulta, mis cachés de clase y mis cachés de entidades con la suficiente facilidad.NHibernate almacenamiento en caché de segundo nivel - regiones desalojar

Pero lo que realmente quiero es borrar la memoria caché según la región. sessionFactory.EvictQueries() tomará un parámetro de región, pero Evict() y EvictCollection() no. Realmente no quiero descartar todo el caché aquí, ni tampoco quiero mantener algún tipo de diccionarios torpes asociando tipos con sus regiones de caché. ¿Tiene nHibernate una manera de preguntar a una entidad o colección cuál es su configuración de almacenamiento en caché?

gracias

+0

Hola @Ted, parece que estás intentando hacer algo manualmente que ya puedes conectar. ¿Hay alguna razón por la que no está configurando algún tipo de dependencia de caché para desalojar automáticamente los elementos cuando se realiza un cambio en el almacén de datos? ¿Como una SqlCacheDependency? – swannee

+0

o incluso mejor, ¿usar un caché distribuido? nHibernate admite esos –

+0

Me encantaría usar un caché distribuido pero los clientes no están interesados, por razones estúpidas del cliente. Estoy investigando CacheDependency ahora, aunque estamos usando Oracle, por lo que la implementación específica de SQL Server no me sirve. Parece que la implementación genérica de dbCacheDependency funciona por sondeo, y se basa en algunas cosas OLEDB. ¿Es eso rendimiento? ¿tiene implicaciones para mis elecciones de conductor? Estoy buscando controladores de Oracle de terceros como DataDirect y Devart, así como ODP.NET. – Ted

Respuesta

0

OK, parece que he respondido a mi propia pregunta. La interfaz predeterminada que se devuelve al extraer los metadatos nHibernate no proporciona información sobre el almacenamiento en caché, sin embargo, si busca en las implementaciones de la misma, lo hace. Un poco torpe, pero hace el trabajo.

4

acabo de hacer la misma cosa. Para beneficio de todos, este es el método que construí:

public void ClearCache(string regionName) 
    { 
     // Use your favourite IOC to get to the session factory 
     var sessionFactory = ObjectFactory.GetInstance<ISessionFactory>(); 

     sessionFactory.EvictQueries(regionName); 

     foreach (var collectionMetaData in sessionFactory.GetAllCollectionMetadata().Values) 
     { 
      var collectionPersister = collectionMetaData as NHibernate.Persister.Collection.ICollectionPersister; 
      if (collectionPersister != null) 
      { 
       if ((collectionPersister.Cache != null) && (collectionPersister.Cache.RegionName == regionName)) 
       { 
        sessionFactory.EvictCollection(collectionPersister.Role); 
       } 
      } 
     } 

     foreach (var classMetaData in sessionFactory.GetAllClassMetadata().Values) 
     { 
      var entityPersister = classMetaData as NHibernate.Persister.Entity.IEntityPersister; 
      if (entityPersister != null) 
      { 
       if ((entityPersister.Cache != null) && (entityPersister.Cache.RegionName == regionName)) 
       { 
        sessionFactory.EvictEntity(entityPersister.EntityName); 
       } 
      } 
     } 
    } 
Cuestiones relacionadas