IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XMLRAD Discussion :

Pools, connexions et sessions BDD


Sujet :

XMLRAD

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut Pools, connexions et sessions BDD
    Bonjour!
    En vue de répondre aux normes FDA, nous souhaitons tracer toutes les modifications apportées aux données de notre appli. Pour effectuer cela, nous mettons en place des triggers (attendez avant de sauter de votre chaise! ) qui journalisent de cette façon toutes les opérations effectuées y compris celles qui ne sont pas faite directement pour notre appli (certains de nos utilisateurs se connectent avec Access par exemple, voir des appli propriétaires, pour extraire et/ou modifier des données).
    Ces triggers doivent etre capable d'indiquer quel est l'utilisateur logique (login interne à notre application) qui a effectué telle opération. Pour cela dans l'appli "windows", on joint le compte utilisateur et la session SQLServer ou Oracle. En mode connecté, pas de probleme.
    Dans l'application XMLRAD ca se complique.... j'ai 4 pool et en plus pour chaque xmlmodule, potentiellement une connexion à la BDD (partage de code) (d'ailleurs j'ai une question à ce sujet que je soulèverais plus tard...). Donc pour un user sur l'appli je vais avoir plusieurs sessions BDD et entre chaque requete HTTP je suis biensur susceptible d'avoir plusieurs users différents.

    Pour les courageux qui m'ont lu jusque la, voici ma question:
    Ou mettre mon code qui me permettra de faire le lien entre la session et l'utilisateur? Je ne peux pas faire cela trop tot (dans le dispatch) car j'ai besoin de connaitre qu'elle sera exactement la session BDD qui sera utilisée. Je ne sais pas si c'est possible ni si c'est centralisable (si ca l'est pas, je le ferais pas )


    Michael

  2. #2
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut Pools, connexions et sessions BDD #2
    Allez, la suite directement:
    Actuellement j'ai un ADOConnection par XMLmodule. Cela car j'ai besoin de connecter un ensemble d'objets basé sur des ADOQuery classiques pour effectuer un certain nombre d'opérations (ca représente plus d'une centaines de méthodes dans pleins de datamodules... trop délicat et couteux de les migrer en dacquery aujourd'hui... même si dans l'absolu ce serait l'idéal!).
    J'aimerais plutot que de gérer cela par XMLModule, le faire par Pool, ce qui me parait plus logique. Comment puis-je créer un objet ADOConnection par instance de pool (pour le partager ensuite aux modules du pool)? Y a t-il un "endroit" privilégié, sorte de threadvar ou qqch comme ca ? J'aimerais gérer cela proprement.

    Michael

  3. #3
    RDM
    RDM est déconnecté
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Par défaut Re: Pools, connexions et sessions BDD
    Citation Envoyé par Jeweller
    Ou mettre mon code qui me permettra de faire le lien entre la session et l'utilisateur? Je ne peux pas faire cela trop tot (dans le dispatch) car j'ai besoin de connaitre qu'elle sera exactement la session BDD qui sera utilisée. Je ne sais pas si c'est possible ni si c'est centralisable (si ca l'est pas, je le ferais pas )
    j'ai un peu du mal a visualiser ce que t tu veux , et de quelles informations tu as besoin.
    De toutes facons il faut se tourner vers les evenénements XMLApplication ou XMLCollection.
    les événements XMLApplication sont déclenchés en dehors des XMLCollections donc tu n'as normalement pas encore accès aux ressources des XMLcollections et donc pas d'accès aux BDD.
    les événements XMLCollection sont déclenchés une fois que ta requête a acquis une XMLCollection et donc la tu as accès aux connexions BDD.
    le XMLCollection.BeforeDispatch me semble un bon endroit en général.

  4. #4
    RDM
    RDM est déconnecté
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Par défaut Re: Pools, connexions et sessions BDD #2
    Citation Envoyé par Jeweller
    Allez, la suite directement:
    Actuellement j'ai un ADOConnection par XMLmodule. Cela car j'ai besoin de connecter un ensemble d'objets basé sur des ADOQuery classiques pour effectuer un certain nombre d'opérations (ca représente plus d'une centaines de méthodes dans pleins de datamodules... trop délicat et couteux de les migrer en dacquery aujourd'hui... même si dans l'absolu ce serait l'idéal!).
    J'aimerais plutot que de gérer cela par XMLModule, le faire par Pool, ce qui me parait plus logique. Comment puis-je créer un objet ADOConnection par instance de pool (pour le partager ensuite aux modules du pool)? Y a t-il un "endroit" privilégié, sorte de threadvar ou qqch comme ca ? J'aimerais gérer cela proprement.

    Michael
    il te suffit de mettre ton ADOConnection dans un module central (Common) et public dans ce module puis dans tous les modules dont tu as besoin de cette ADOConnection, tu décalres une données membre du type du XMLModule Commun genre
    et dans le OnInitialize du module tu fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    begin
      FxmCommon := XMLCollection.GetModule('xmCommon') as TxmCommon;
    end;
    pour l'initialiser correctement
    et après dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FxmCommon.ADOConnection.Open;

  5. #5
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut
    Pour le point 2 (xmCommun), c'est excatement ce que je cherchais! J'avais pas réussi à le matérialiser, Merci!

    Pour le premier point (session BDD), je vais faire un peu autrement et me baser sur le xmCommun de façon à référencer l'ensemble des sessions disponibles d'entrée de jeu et passer ensuite par le OnDispatch de la collection... A voir encore, je sais pas trop... Si ca vous interesse je vous donnerais le resultat de tout ca.

    Michael

  6. #6
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut
    et dans le OnInitialize du module tu fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    begin 
      FxmCommon := XMLCollection.GetModule('xmCommon') as TxmCommon; 
    end;

    pour l'initialiser correctement
    Petit truc, XMLCollection est disponible depuis le Module et non en dehors de celui-ci (dans le initialize)... J'ai donc déplacer le GetModule dans le constructeur de celui-ci... Je vais tester de cette façon, ca devrait fonctionner aussi!

    Michael

  7. #7
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut
    Contrairement à ce que je pensais, le GetModule ne crée pas le module... comment le créer pour chaque collection et le référencer pour que le GetModule renvoie la référence et non nil ?
    Michael

  8. #8
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut
    Non, au final il semblerait surtout que dans create du module, le xmlcollection ne soit pas affecté... ce qui parait logique. Le OnInitialize parait donc plus indiqué!

  9. #9
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut
    Question subsidiaire:
    Sur un XMLModule qui est référencé dans tous les pool, il y a un composant CollectionEvent... Est ce que ses évènements réagissent pour tout les pool ou seulement pour le premier ? Autrement dit, est ce qu'un seul composant CollectionEvent est suffisant pour géré les evenements dispatch par exemple de tout les pools (si le module sur lequel il est posé est référencé dans tous les pools) ?

    Michael

  10. #10
    RDM
    RDM est déconnecté
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Par défaut
    oui tout est dans la phrase "si le module sur lequel il est posé est référencé dans tous les pools"

  11. #11
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut
    Desole, je reviens à la charge avec l'histoire du xmCommon.
    J'ai une application en mode pluggin... 2 Dll sont chargées. Dans la principale j'ai mon XMCommon qui possède les objets partagés dans chaque pool. Dans la seconde dll, (dont l'unique module est positionné sur le pool principal 'User'), j'ai aussi besoin d'accéder à ce même XmCommon... Comment faire ? Dans le OnInitialize de ce module j'ai le même code qui fait le GetModule, mais j'ai une exception Invalid Class Type (sur le "as TXmCommon")... Comment je peux m'en sortir ?

    Michael

  12. #12
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut
    Je peux m'en sortir comme ca:

    Dans le OnInitialize de tous mes modules
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      try
         FXmComm := Module.XMLCollection.GetModule('MOS_Common') as TMOS_Common;
      except
          FXmComm := TMOS_Common.Create(nil);
          FXmComm.Name := 'MOS_Common';
          Module.XMLCollection.AddModule(FXmComm);
      end;
    Une tricherie un peu bourine qui fonctionne pour la seconde dll chargée... le soucis c'est que ca m'explose à la figure quand je iisreset... je suppose que si je le crée moi même, je dois le libérer moi même... je vais tester...

    Michael

  13. #13
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut
    Je me fais mon thread tout seul moi 8)

    OnInitialize:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     SelfCreatedXmCom := false;
     try
         FXmComm := Module.XMLCollection.GetModule('MOS_Common') as TMOS_Common;
     except
          FXmComm := TMOS_Common.Create(nil);
          FXmComm.Name := 'MOS_Common';
          SelfCreatedXmCom := true;
     end;
    (On pourrait utiliser le 'is')

    A la destruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     if not SelfCreatedXmCom
     then FXmComm := nil
     else  FXmComm.Free;
    Et ca a l'air de fonctionner...

    Michael

  14. #14
    RDM
    RDM est déconnecté
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Par défaut
    oulah c'est super dangeureux tout ca.
    pour les plugins les modules sont bien créés dans la même XMLCollection
    seulement tu as du mettre dans ton module un uses xmCommon
    ce qui a eu pour effet de compiler l'unité dans ton plugin.
    Or cette unité est déjà compilé dans la DLL principale.
    du coup tu as 2 TxmCommon qui sont des types incompatibles
    Il faut que tu passes par un package central comme le VCLXMLxx.bpl et que les 2 DLL link sur ce package pour partager la même classe xmCommon

  15. #15
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut
    Mmm, pourquoi est ce que je m'en doutais....

    Je risque quoi en réalité ?
    Compiler XmCommon dans un paquet a peut etre l'air de rien comme ca, mais au regard de mon projet, ca se complique sérieusement...

  16. #16
    RDM
    RDM est déconnecté
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Par défaut
    la meilleure chose reste alors d'encapsuler les méthodes dont tu as besoin dans un XMLService qui sera alors invokable par un XMLCollection.execute ou une instruction Invoke

  17. #17
    Membre éclairé Avatar de Jeweller
    Inscrit en
    Août 2003
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 357
    Par défaut
    Oui, c'est une idée aussi!
    Bon, au final, j'ai réussi à compiler xmCommon dans un bpl séparé... malgré les insultes de Delphi voulant rajouter tout un tas de dépendances qui ne sont pas possibles pour moi... ca fonctionne bien, la seconde dll ne pese plus que 90Ko contre plus 3Mo avant! (forcement tout est passé dans le bpl)
    je pense d'ailleurs que mon architecture est bien meilleure comme ca!
    Donc Merci bcp!

    : J'ai encore juste un truc dont je voudrais etre sur: J'ai donc 4 pools, chacun connecte en plus de la database du framework, une adoconnection. Ainsi il y a 8 sessions ouvertes sur la base de données. En terme de licences, je suppose que MSSQL ou Oracle comptent autant de licences que d'utilisateurs potentiellement connectés à l'appli, et pas juste 1 voir 8 licences ? C'est bien ca ?

    Michael

  18. #18
    RDM
    RDM est déconnecté
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Par défaut
    auparavant c'etait au nombre de session conenctés donc dans ton cas c'est bien 8, quelques soit le nombre d'utilisateur de ton application.
    Au vu des archis Web voire des 3 tiers, certains editeurs ont changé leur mode de licence pour le faire par processeur ou par Mhz pour prendre compte ces nouvelles archis ou l'on ne peut plus facilement compté le nombre d'utilisateurs conenctés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Connexion a une BDD Mysql par pool BoneCP
    Par 11mad11 dans le forum JDBC
    Réponses: 5
    Dernier message: 04/02/2015, 08h55
  2. [C#][VS 2005 express]Pb de connexion a ma BDD
    Par Sodangbe dans le forum Windows Forms
    Réponses: 13
    Dernier message: 03/05/2006, 16h30
  3. probleme de connexion a la bdd
    Par ldoudl dans le forum ASP
    Réponses: 3
    Dernier message: 26/01/2006, 15h45
  4. [pool connexion tomcat]
    Par agougeon dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 16/01/2006, 16h18
  5. [Tomcat]tomcat+pool connexion
    Par Nanoua dans le forum Tomcat et TomEE
    Réponses: 11
    Dernier message: 05/01/2006, 12h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo