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

Web & réseau Delphi Discussion :

Requête Firebird dans l'AThread d'indy


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 42
    Par défaut Requête Firebird dans l'AThread d'indy
    Bonjour

    J'ai une appli qui reçoit des données de terminaux distants. J'utilise TidTCPServer (indy 9), delphi 7 et firebird 2. Le problème est que quand le nombre de connections augmente (>5) mon serveur plante

    Mes questions sont les suivantes:
    - dois-je créer une transaction pour chaque requête (donc pour chaque thread)?
    - j'utilise les composants FIBPlus: celà pose-t-il un problème? les composants IBX sont ils plus performants dans mon cas?
    - le composant TServerSocket serait-il plus adapté à ce cas précis?

    Ci-dessus mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    procedure TFrmMain.TCPServerExecute(AThread: TIdPeerThread);
    var
     errorStr, Trame:string;
     thTrans : TpFIBTransaction;
     thQuery : TpFIBQuery;
    begin
     try
      begin
      if not AThread.Terminated and AThread.Connection.Connected then
        begin
         Trame := AThread.Connection.ReadLn;
         if Trame <> '' then
          begin
           try
            begin
             //Création des Objets
    //          thTrans := TpFIBTransaction.Create(nil);
             thQuery := TpFIBQuery.Create(nil);
    //        thTrans := TIBTransaction.Create(Application);
    //        thQuery := TIBQuery.Create(Application);
             //Modif des propriétés
    //         with thTrans do
    //         begin
    //          DefaultDatabase := dbTCPServer;
    //          thTrans.TimeoutAction := TACommit;
    //          thTrans.Timeout := 1;
    //          Active := True;
    //         end;
            with thQuery do
             begin
              DataBase := dbTCPServer;
              Transaction := dbTCPServer.DefaultTransaction; //dbTrans;
              SQL.Add('INSERT INTO DATA (DECDATA) VALUES (:DECDATA)');
             end;
            //Début de la transaction, insertion, et commit
    //        thTrans.StartTransaction;
            with thQuery do
             begin
              Params.ParamByName('DECDATA').AsString := Trame;
              ExecQuery;
             end;
    //         thTrans.Commit;
            end
           except on e:exception do
            begin
             logError('Erreur SaveTrame : ' + e.Message);
             //ShowMessage('Erreur : ' + e.Message);
            end
           end;
          end;
        end;
      end
     except on e:exception do
      begin
       errorStr := e.Message;
      end
     end;
    end;
    Merci beaucoup de votre aide

  2. #2
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 42
    Par défaut Problème de veersion de firebird
    Bonjour

    -->edit : ce N'EST PAS UN PROBLEME Firebird !!, en tous cas, pas si vous utilisez la version 2.

    en fait, il faut éviter d'utiliser les composants IBX par défaut de Delphi quand
    on fait du multithreading. Les composants les plus adaptés pour ce genre de tâches sont les UIB

    Pour ceux que ça intéresse, je viens de tester la même appli avec MS SQL Server puis avec FireBird: le constat est simple, la version avec Firebird est beaucoup plus rapide !! (faudra tester avec des composants autre que les ADO/dbGo de delphi avec SQL Server pour avoir une réponse définitive, exemple: les crLab SDAC).

    Citation Envoyé par micheln Voir le message
    Il semble que c'est un problème de version de firebird.
    De toute façon, le cahier de charges a été modifié pour utiliser MS SQL Server.



    Bonjour

    J'ai une appli qui reçoit des données de terminaux distants. J'utilise TidTCPServer (indy 9), delphi 7 et firebird 2. Le problème est que quand le nombre de connections augmente (>5) mon serveur plante

    Mes questions sont les suivantes:
    - dois-je créer une transaction pour chaque requête (donc pour chaque thread)?
    - j'utilise les composants FIBPlus: celà pose-t-il un problème? les composants IBX sont ils plus performants dans mon cas?
    - le composant TServerSocket serait-il plus adapté à ce cas précis?

    Ci-dessus mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    procedure TFrmMain.TCPServerExecute(AThread: TIdPeerThread);
    var
     errorStr, Trame:string;
     thTrans : TpFIBTransaction;
     thQuery : TpFIBQuery;
    begin
     try
      begin
      if not AThread.Terminated and AThread.Connection.Connected then
        begin
         Trame := AThread.Connection.ReadLn;
         if Trame <> '' then
          begin
           try
            begin
             //Création des Objets
    //          thTrans := TpFIBTransaction.Create(nil);
             thQuery := TpFIBQuery.Create(nil);
    //        thTrans := TIBTransaction.Create(Application);
    //        thQuery := TIBQuery.Create(Application);
             //Modif des propriétés
    //         with thTrans do
    //         begin
    //          DefaultDatabase := dbTCPServer;
    //          thTrans.TimeoutAction := TACommit;
    //          thTrans.Timeout := 1;
    //          Active := True;
    //         end;
            with thQuery do
             begin
              DataBase := dbTCPServer;
              Transaction := dbTCPServer.DefaultTransaction; //dbTrans;
              SQL.Add('INSERT INTO DATA (DECDATA) VALUES (:DECDATA)');
             end;
            //Début de la transaction, insertion, et commit
    //        thTrans.StartTransaction;
            with thQuery do
             begin
              Params.ParamByName('DECDATA').AsString := Trame;
              ExecQuery;
             end;
    //         thTrans.Commit;
            end
           except on e:exception do
            begin
             logError('Erreur SaveTrame : ' + e.Message);
             //ShowMessage('Erreur : ' + e.Message);
            end
           end;
          end;
        end;
      end
     except on e:exception do
      begin
       errorStr := e.Message;
      end
     end;
    end;
    Merci beaucoup de votre aide

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

Discussions similaires

  1. Erreur de conversion et requête dynamique dans une procédure
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/08/2005, 15h12
  2. récupérer le résultat d'une requête sql dans un edit
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/07/2005, 14h07
  3. Problème requête SQL dans page ASP
    Par rocs dans le forum ASP
    Réponses: 14
    Dernier message: 26/07/2005, 15h38
  4. Problème de requète SQL dans un Requery
    Par Keraccess dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/10/2004, 14h58
  5. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 16h11

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