41 votes

Quelle devrait être la durée de vie d'une session NHibernate?

Je suis nouveau sur NHibernate, et ont vu de certains problèmes lors de la fermeture de sessions prématurément. J'ai résolu ce problème temporairement en réutilisant des séances au lieu de l'ouverture d'une session par transaction. Cependant, j'étais sous l'impression que l'ouverture de sessions à chaque fois que vous en avez besoin est l'approche recommandée pour la session de gestion de durée de vie. Non?

Alors, quelle est la meilleure façon de gérer les sessions? Ce qui devrait leur durée de vie de l'être? Une session pr transaction? Un singleton session de tout prendre en charge? Ou quoi?

Edit:

Notez que mon architecture de l'application est une application de bureau de la communication avec un serveur de côté service, qui est ce qui fait toute la Base de données de la manipulation, à l'aide de NHibernate + à l'aise. (Si cela fait une différence...)

27voto

Neil Hewitt Points 2163

Vous souhaitez une session de stratégie de gestion qui permet à votre application de fonctionner efficacement et de profiter des choses que NHibernate vous donne notamment la mise en cache et le chargement paresseux.

La création de sessions est un processus peu coûteux et nécessite peu de place-devant de la RAM ou du PROCESSEUR, de sorte que vous ne devriez pas vous inquiéter à propos de la conservation ou de la ré-utilisation de sessions (en effet, la ré-utilisation peut conduire à de méchants et de l'onu attendu d'effets secondaires). La session de l'usine est la chose coûteuse et devrait être construit qu'une seule fois et seulement une fois à l'application de démarrage.

La règle de base est: est-ce la durée de session doit être suffisamment longue pour que vous n'avez pas d'objets persistants traîner dans le champ d'application après la fin de la session.

Une fois que la session se termine, tous les changements de suivi pour les objets que vous avez obtenu à partir de cette session s'arrête, pour ceux qui ne sont pas sauvés, sauf si vous délibérément ré-attacher l'objet d'une nouvelle session. La session devrait donc être autour depuis aussi longtemps que les objets que l'on récupère vont exister. Dans une application Web, qui signifie généralement une session pour chaque demande; en WinForms, une session pour chaque formulaire.

Dans votre cas, avec un service (je suppose qu'il exécute comme un service Windows) faire l'NHibernate travail, vous pourriez vouloir envisager une session créé pour chaque nouvelle demande de le consommer de l'application de bureau, et de le disposer lorsque cette demande a été traitée. Ne sachant pas exactement comment votre service s'exécute et que le mécanisme de l'application de bureau utilise pour parler (remoting? WCF? Le bon vieux SAVON?) Je ne peux pas vraiment être plus précis.

(Il y a quelques exceptions à cette règle générale - supposons que vous disposez d'un ensemble d'objets persistants qui représentent une ressource partagée à laquelle d'autres code se référer, mais pas de changement, vous pouvez les charger à l'avance à app-démarrer et laisser déconnecté à partir de là.)

Si vous trouvez la performance atone en vertu de cette stratégie, il est peut-être que vous êtes juste de parler à la base de données trop et votre objet graphique est complexe; regardez deuxième niveau de mise en cache dans ce cas.

11voto

Dans une application web, vous devriez avoir une session par demande. Cela vous donne le plein contrôle sur la durée de session et simplifie la gestion des erreurs.

Dans une application de bureau, je recommande l'utilisation d'une session par un présentateur (ou si vous préférez). Pour citer Ayende dans son article de MSDN Magazine:

La pratique recommandée pour les ordinateurs de bureau applications est d'utiliser une session par forme, de sorte que chaque forme dans le l'application a sa propre session. Chaque la forme représente généralement une distincte pièce de travail que l'utilisateur souhaite pour effectuer, de sorte session correspondante la durée de vie de la forme de vie fonctionne assez bien dans la pratique. L'ajout avantage est que vous n'avez plus d' problème avec les fuites de mémoire, parce que lorsque vous fermez un formulaire dans la application, vous pouvez également disposer de la session. Cela permettrait de faire toute la les entités qui ont été chargés par le session admissibles à la remise en état par le garbage collector (GC).

Il y a d'autres raisons pour préférant une seule session par formulaire. Vous pouvez profiter de NHibernate est le suivi des modifications, donc il va vider toutes les les changements à la base de données lorsque vous valider la transaction. Il a également crée une barrière d'isolement entre les différentes formes, de sorte que vous pouvez vous engager la modification d'une seule entité, sans se soucier des modifications à d'autres les entités qui sont indiquées sur d'autres les formulaires.

6voto

David M Points 45808

Une session doit correspondre à une unité de travail. La session doit rester active pendant que vous travaillez avec les objets récupérés ou persistants à l'aide de cette session.

2voto

kgiannakakis Points 62727

Il n'y a pas une réponse qui convient à toutes les situations. La session 13 de Summer of Nhibernate présente un bon aperçu de la question.

0voto

David Pfeffer Points 12792

Une grande partie de la NHibernate framework et Microsoft ADO.NET Entity Framework sont similaires. Voici un très bon article sur la façon dont vous devez contrôler un ObjectContext bouée de sauvetage dans l'ADO.NET EF.

http://blogs.msdn.com/alexj/archive/2009/05/07/tip-18-how-to-decide-on-a-lifetime-for-your-objectcontext.aspx

Il devrait s'appliquer à NHibernate les sessions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X