0

Dans l'application j'ai une table de référence appelée Cycles qui est mappée à entité cycle. Fondamentalement, la plupart des mappages avec des entités NHibernate gardent des références à cette table. Habituellement, ces entités ont des domaines tels que:Options de mise en cache pour NHibernate

  • StartCycle
  • ModificationCycle
  • EndCycle
  • Cycle

etc.

Même si j'utilise séance par demande, je vois encore dans les journaux cette majorité des requêtes sont émises à . Cycles. C'est le cas lorsque je ne demande pas par Cycle ID, mais par d'autres propriétés qui appartiennent au type Cycle.

Cycle de type est presque immuable, il a Statut propriété, et en fait c'est la seule propriété qui peut être changé par les classes de service (comme CloseCycleService, Open etc ...). Le cycle ne peut pas être supprimé, mais peut être inséré.

Donc je voudrais minimiser le nombre de requêtes à Cycles.

Je pourrais le mettre en cache à l'intérieur d'ASP .NET en utilisant le cache d'application, et créer une autre couche d'abstraction, mais avant de le faire je voudrais savoir quelles sont les options données par NHibernate et quels sont les inconvénients?

Le seul problème que je vois est multithreading - même si Cycle est presque immuable (et sans état), il peut arriver que deux demandes tentent de modifier la même entité en même temps et il pourrait provoquer une erreur. Mais ... c'est presque impossible.

Donc, pourriez-vous me dire ce que je peux faire avec NHibernate pour stocker tout le contenu de la table Cycles dans le cache (oh, je n'ai pas mentionné que le nombre de données dans cette table est petit: 1 cycle par mois il est environ 20rows, et augmentera 1row par mois) et minimise les requêtes qui sont émises à Cycles table?

Répondre

2

Utilisez le cache de second niveau NHibernate avec SysCacheProvider et le cache de requête - lorsque vous créez une requête pour votre entité Cycle, appelez .SetCacheable (true) qui stockera les résultats de la requête dans le cache (ainsi que l'entité lui-même)

Le cache de deuxième niveau de NHibernate est très bien implémenté et gardera le cache cohérent avec toutes les modifications que vous faites dans le même processus. Si vous effectuez des changements directement dans la base de données, alors vous pouvez regarder le SysCacheProvider2 (je pense) qui, je crois, a également un support pour SqlDependencies.

Questions connexes