2009-05-27 8 views
2

J'ai quelques classes qui ont une propriété qui est unique à cet objet, par exemple pour la classe User, la propriété Username ne devrait jamais être dupliquée. NHibernate ne semble pas supporter le chargement d'un objet par une clé unique qui est ensuite mise en cache de la même manière que Load() ou Get(). Ai-je raison de dire cela? Si je le suis alors je devrai juste jouer le mien via éventuellement une méthode d'extension sur les lignes de LoadByUniqueIndex (propriété lambda, clé d'objet).NHibernate mise en cache sur des index uniques?

Répondre

1

Oui, vous avez raison, NH n'obtient pas d'entités directement du cache pour autre chose que l'ID. Notez que tout sauf l'identifiant peut potentiellement changer et doit être recherché dans la base de données.

Soyez prudent lors de la mise en cache. "La mise en cache prématurée est la racine de tous les maux" ou quoi que ce soit. Sérieusement, si vous n'êtes pas sûr d'avoir des problèmes de performances notables, n'écrivez pas votre propre cache.

  • Écrire du code qui transmet des entités en tant qu'arguments pour éviter que la même entité soit chargée plusieurs fois.
  • Évitez les caches qui durent plus longtemps qu'une session. Vous aurez des données obsolètes si vous ne notifiez pas tous les changements.
  • évitez les antémémoires statiques, utilisez le thread statique à la place. Cela évite le partage de données entre les sessions, ce qui romprait l'isolation de la transaction. Utilisez les caches de deuxième niveau si vous en avez vraiment besoin.

Si vous envisagez d'avoir un cache statique qui reste actif tant que l'application s'exécute, je peux vous dire qu'il vaut mieux l'éviter. Il ne fonctionnera pas correctement avec un effort raisonnable.

+0

Ok merci Stefan, je vais attendre pour le moment. Au moins, je sais avec certitude comment fonctionne la mise en cache maintenant. –

Questions connexes