2011-08-11 2 views
0

J'utilise SysCache2 et NHibernate 2.1.2.4. Peu importe combien j'essaie, NHibernate continue à charger les instances précédentes d'une entité.Pourquoi NHibernate ne supprime-t-il pas les entités du cache de second niveau lorsqu'elles sont mises à jour?

Ma classe est mappée ReadWrite en cache.

La zone de cache est la zone par défaut, c'est-à-dire le nom complet des types de la classe.

J'effectue toutes les actions d'une transaction.

La base de données est définitivement en cours de mise à jour et lorsque j'efface manuellement le cache ASP.NET, le problème disparaît.

que je fais une simple mise à jour, comme ceci:

using(var transaction = NHSession.BeginTransaction()) 
{ 
    var foo = Session.Load<Foo>(_fooId); 

    foo.Name = "A new name"; 

    transaction.Commit(); 
} 

Puis-je recharger l'entité plus tard (dans une autre session dans l'application), comme ceci:

using(var transaction = NHSession.BeginTransaction()) 
{ 
    var foo = Session.Load<Foo>(_fooId); 

    Response.Write(foo.Name); 

    transaction.Commit(); 
} 

.. mais le nom de Foo est toujours l'ancien nom, pas le nouveau nom que je viens de mettre à jour!

Répondre

1

J'ai travaillé celui-ci - pour certaines raisons j'avais deux usines de session. Je n'avais pas réalisé que l'opération de sauvegarde se déroulait dans une usine et que la charge se produisait dans l'autre.

1

Je voudrais enregistrer tous les messages liés à la mise en cache et voir si le cache est mis à jour lorsque la deuxième transaction est validée. Voici un exemple de configuration log4net pour consigner les messages de mise en cache ...

<logger name="NHibernate.Cache.ReadWriteCache" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="Console"/> 
</logger> 

+0

Salut merci J'ai vérifié les logs et l'entité n'est pas invalidée quand elle est mise à jour. – cbp

0

Pourquoi utilisez-vous Load au lieu de Get? Je soupçonne que cela a quelque chose à voir avec le problème. This article explique les différences, mais ne rapporte rien de spécifique à votre problème. Pourtant, j'essaierais de passer à Get.

+0

Je ne comprends pas comment cela pourrait être le problème - Load est pour le chargement d'un proxy seulement, alors que Get récupère toute l'entité immédiatement. À part ça, je ne vois pas comment ils sont liés à la mise en cache. – cbp

+0

Get vérifie le cache de 1er et 2ème niveau. La grande différence est que Load ne retournera jamais null; Get renverra null si l'entité n'existe pas. Cela n'a aucun sens de charger une propriété et d'accéder immédiatement aux propriétés autres que son ID, comme vous le faites. Ma conjecture est que l'entité mise en cache n'est pas mise à jour parce que vous mettez à jour un proxy, pas l'entité réelle. –

+0

Je ne pense pas que cela ait un sens - dès que vous définissez une propriété d'un proxy, il devrait être non-lui-même. – cbp

Questions connexes