|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||||||||||
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2009 Messages : 35 ![]() |
Bonjour à tous
3 couches dans mon "projet" :
Je voudrais que les sessions (NHibernate) soient créées et détruites dans le même timing que les requêtes http. J'ai vu et lu beaucoup d'articles sur le net qui parle de ce système. Malgré cela je ne parviens pas réussir cette prouesse. Voici ce que j'ai fait : ** Web service ** web.config Code :
Appel à une methode du contract Code :
Code :
Repository contact fait appel à la propriété Session Code :
ICriteria criteria = Session.CreateCriteria<Contact>(); Code :
Code :
Code :
Code :
Code :
Bien à vous |
||||||||||||||||
|
|
00
|
|
|
#2 | ||
|
Membre expérimenté
![]() Nicolas Inscription : janvier 2011 Messages : 390 ![]() |
Tout ces morceaux de codes ne donne pas la vision de l'architecture des classes.
Mais comme ça je dirais que ton NHibernateHttpModule me semble un peu light et bien qu'il gère le close des sessions hibernate ne gère pas vraiment leur création et leur cycle de vie. Je pense qu'il faut ce genre de méthode devrait se trouver dans NHibernateHttpModule Code :
Après le SessionHelper peut utiliser Fluent pour créer la session mais n'utilise pas un singleton (sinon une session pour tout le monde et toutes les requêtes). Mais les sessions doivent être gérer au niveau du HttpContext pour une session par requête. |
||
|
|
00
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2009 Messages : 35 ![]() |
Bonjour
Merci de votre réponse. Je viens de logger le tout et je me rend compte que c'est vraiment à l'appel de la GetCurrentSession que j'ai un souci. Donc mon HttpModule travail très bien. Lors du bind je log l'id de la session. De même je log l'id de la session lors du unbind. Les deux sont identiques. Je travail avec des WCF peut être que la gestion de context ("current_session_context_class" , "web") n'est pas adapté pour les wcf. J'ai également essayer managed_web, mais même résultat. Le but est d'utiliser le GetCurrentSession de ma SessionFactory. Je continue donc mes recherches Bien à vous |
|
|
00
|
|
|
#4 | ||||||
|
Membre expérimenté
![]() Nicolas Inscription : janvier 2011 Messages : 390 ![]() |
Vous voulez tour simplement dire que l'appel :
Code :
Mais que donne le la ligne commenté Code :
Code :
|
||||||
|
|
00
|
|
|
#5 | ||||||||||
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2009 Messages : 35 ![]() |
Bonjour
FNSettings est une classe abstraite contenant toute la logique de configuration de Fluent Nhibernate. Exemple : Code :
Code :
Code :
Code :
Code :
Pourtant ce que j'ai fait c'est
Pour qu'au final l'appel de GetCurrentSession ne fonctionne pas MAIS que le http module fait bien son boulot. Punaise, là je suis vraiment paumé |
||||||||||
|
|
00
|
|
|
#6 | ||
|
Membre expérimenté
![]() Nicolas Inscription : janvier 2011 Messages : 390 ![]() |
Il faudrait vérifier l'état de la SessionFactory
Mais sinon je ne vois pas, et je ne vois pas l’intérêt de FNSettings puisque fluent a déjà une interface simplifiée. Il y a peut-être un problème de lock... en tout cas ça manque de l'implémentation des singletons que tu as réalisé. Et en web le contexte est forcement multithreadé. Un truc touvé sur internet qui semble simple : Code :
|
||
|
|
00
|
|
|
#7 | ||||
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2009 Messages : 35 ![]() |
Citation:
Citation:
Code :
J'ai deux entité : une entité activity et une entité userActivity. L'une et l'autre sont liées. Ceci implique que quand je sauve une activité, je sauve également une userActivity. Ceci doit être fait dans une même transaction, pour cela il faut donc que je récupère la même session et non créer (OpenSession) pour l'insert de l'activity et l'insert du userActivity. J'ai vraiment essayé un tas de chose mais rien n'y fait. Est-ce que quelqu'un pourrait m'aider. Le projet est en train de grandir et ce problème commence à être très dérangeant. Merci pour votre aide. |
||||
|
|
00
|
|
|
#8 | ||
|
Membre expérimenté
![]() Nicolas Inscription : janvier 2011 Messages : 390 ![]() |
Je me replonge dans ce post, désolé pour mon orthographe, j'ai même eu du mal à me relire.
En fait je ne vois qu'une chose c'est que votre singleton n'est pas threadsafe il faudrait l'implémenter ainsi : Code :
|
||
|
|
00
|
|
|
#9 |
|
Candidat au titre de Membre du Club
![]() Inscription : juin 2009 Messages : 35 ![]() |
C'est quelque chose que j'ai du mal à comprendre moi même. J'aurais du mal à vous expliquez mon problème. Mais ce que je sais expliquer par contre c'est ce que je dois parvenir à faire.
Avec Nhibernate la formation de ISession n'est pas très coûteuse en ressource mais n'est pas thread-safe. Je veux que lorsque quelqu'un appel une méthode du web service, une ISession soit créer au début de l'appel et soit détruite en fin de l'appel. Ceci afin que tous les objets métiers créés par Nhibernate ne perdent pas la session qui les a créer et leurs permettre de se sauver eux même en appelant la session qui a été créé lors de l'appel. Vu qu'une session serait créer par appel, je n'aurais pas de souci en ce qui concerne les threads. Voilà. Sincèrement je commence à perdre espoir. Existe t'il de la littérature qui me permettrait de mettre tout cela au clair ? Merci pour votre suivi Edit En faite je crois que ce concept s'approche très fort du Unit Of Work. Mais ceci est normalement pris en charge par Nhibernate. Help
|
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 238 ![]() |
C'est inutile de faire ça, un web service est par essence state less et une session longue sur Nhibernate est une bombe atomique à terme.
Il suffit d'utiliser une session clean dans un unit of work et d'attacher les entités à la session. De toutes les façons le mode que tu cherces à produire est anti-concurrent puisque tu peux avoir potentiellement n sessions gérant l'état de la même entité. Ce qui n'est pas en soit souhaitable. Depuis le temps que j'utilise Nhibernate pour faire des archis distribué, j'en ai retenu une chose essentielle : si j'en viens à tripatouiller les sessions et à chercher à les maintenir en vie, alors je me suis trompé. Good luck -Et sinon Nhibernate burrow te donnera des pistes, mais qui s'en sert ??? (ici |
|
|
00
|
|
|
#11 |
|
Membre habitué
![]() Alexandre TriguerosArchitecte C# Inscription : février 2003 Messages : 74 ![]() |
Bonjour,
S'il s'agit d'un service WCF, pourquoi ne pas utiliser la classe WCFOperationSessionContext ? (http://nikosbaxevanis.com/2011/03/30...essioncontext/) Pour ce qui est de la gestion de la concurrence, je recommande très fortement la lecture du livre "NHibernate in action" qui donne des tas de pistes sur comment gérer l'accès concurrentiel et les problèmes les plus connus. Bonne journée |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com