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

  1. #1
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    juillet 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : juillet 2010
    Messages : 71
    Points : 46
    Points
    46

    Par défaut Problème de générateur

    Bonjour à toutes et tous
    Je me permets de venir vers vous pour exposer un problème que je rencontre depuis peu avec une base de données Firebird

    Envrionnement de production
    Moteur Base de données Firebird 2.5 installé en Super Classique sur un serveur Citrix (serveur virtualisé)
    Base de données hébergée sur ce même serveur volumétrie 10Go environ, 260 tables, aucune contrainte de clé primaire, ni clé étrangère

    Environnement applicatif
    Application client développée en Delphi XE6 (accès lient serveur) via FireDac, gestion manuelle des transactions
    Application exécutée sur 10 serveurs Citrix (environ 2 à 3 utilisateurs par serveur Citrix)
    Quelques pics de montée en charge mais rien de bien phénoménal

    Problématique
    L'application utilise un générateur Firebird pour obtenir une clé technique unique pour la base de données.
    Cette clé est ensuite insérée dans une table de données.
    L'obtention de la clé se fait via un composant FireDac procédure stockée qui invoque simplement la procédure stockée de la base qui incrémente le générateur de 1.

    Depuis quelque temps, je me rends compte que je peux me retrouver avec des doublons de clé, ce qui commence a mettre en péril l'intégrité de la base de données

    En mode deboggage, aucun souci et aucune reproductivité possible, le générateur renvoyé est toujours unique.

    Pistes de réflexion
    Mauvais paramétrage de Firebird (volume de cache,...)
    Temps de latence des serveurs Citrix
    Montée en charge excessive

    Si quelqu'un a déjà rencontré un problème similaire, ou simplement me donner des pistes de réflexion, je vous en remercie par avance

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    10 744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 10 744
    Points : 27 369
    Points
    27 369
    Billets dans le blog
    23

    Par défaut

    Bonjour,

    je n'ai jamais rencontré ce problème quoique l'environnement soit différent 1 serveur une vingtaine de clients.
    Je m'attendais plutôt à un problème du genre "trous" mais pas à un problème de doublons

    [QUOTE=mballasse;11069956]Bonjour à toutes et tous
    Je me permets de venir vers vous pour exposer un problème que je rencontre depuis peu avec une base de données Firebird

    aucune contrainte de clé primaire, ni clé étrangère
    là je trouve ça moins que contraignant !


    FireDac, gestion manuelle des transactions
    L'application utilise un générateur Firebird pour obtenir une clé technique unique pour la base de données.
    Cette clé est ensuite insérée dans une table de données.
    L'obtention de la clé se fait via un composant FireDac procédure stockée qui invoque simplement la procédure stockée de la base qui incrémente le générateur de 1.
    Jamais je n'aurais fait comme ça ! Les triggers de Firebird sont là pour ça, utiliser une procédure stockée pour incrémenter un générateur au sein de transactions gérées manuellement me parait un pari risqué.

    J'ajouterai dans les pistes un problème de transaction
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    4 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 4 034
    Points : 12 117
    Points
    12 117

    Par défaut

    Salut à tous.

    Citation Envoyé par mballasse
    aucune contrainte de clé primaire, ni clé étrangère
    Ce n'est pas trop la philosophie des SGBDR de ne pas utiliser des clefs primaires et étrangères.
    A l'origine, ce sont des fichiers Excel qui vous chargez dans FireBird ?

    Citation Envoyé par mballasse
    Depuis quelque temps, je me rends compte que je peux me retrouver avec des doublons de clé, ce qui commence à mettre en péril l'intégrité de la base de données
    Dois-je comprendre que ce problème n'existait pas avant. Qu'est-ce qui a changé depuis ?

    Je pense à un problème de transaction. Qu'est-ce que vous utilisez comme mode transactionnel ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    avril 2010
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2010
    Messages : 189
    Points : 425
    Points
    425

    Par défaut

    Bonjour,

    Je regarderai plutôt la nature et la méthode d'obtention de cette "clé technique unique".
    Si elle est effectivement obtenue depuis un générateur par la fonction gen_id(MonGene,1) et qu'aucune autre procédure ne vient modifier le générateur, peu importe que ce soit directement dans une requête SQL ou par l'intermédiaire d'une procédure stockée, le générateur est "hors transaction" (ou alors il y a un gros problème dans Firebird).

    André

  5. #5
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    juillet 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : juillet 2010
    Messages : 71
    Points : 46
    Points
    46

    Par défaut

    Citation Envoyé par Artemus24 Voir le message
    Salut à tous.


    Ce n'est pas trop la philosophie des SGBDR de ne pas utiliser des clefs primaires et étrangères.
    A l'origine, ce sont des fichiers Excel qui vous chargez dans FireBird ?


    Dois-je comprendre que ce problème n'existait pas avant. Qu'est-ce qui a changé depuis ?

    Je pense à un problème de transaction. Qu'est-ce que vous utilisez comme mode transactionnel ?

    @+
    Je ne peux pas ajouter de contraintes clé primaire clé étrangère

    Pour l'ancienneté du problème, je n'ai pas encore eu le temsp de regarder si cela se produisait avant, mais nous avons eu récemment une montée en charge de la volumétrie, qui pourrait expliquer ce phénomène
    Le mode transactionnel utilisé en ReadCommitted

  6. #6
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    juillet 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : juillet 2010
    Messages : 71
    Points : 46
    Points
    46

    Par défaut

    [QUOTE=SergioMaster;11070002]Bonjour,

    je n'ai jamais rencontré ce problème quoique l'environnement soit différent 1 serveur une vingtaine de clients.
    Je m'attendais plutôt à un problème du genre "trous" mais pas à un problème de doublons

    Citation Envoyé par mballasse Voir le message
    Bonjour à toutes et tous
    Je me permets de venir vers vous pour exposer un problème que je rencontre depuis peu avec une base de données Firebird


    là je trouve ça moins que contraignant !



    Jamais je n'aurais fait comme ça ! Les triggers de Firebird sont là pour ça, utiliser une procédure stockée pour incrémenter un générateur au sein de transactions gérées manuellement me parait un pari risqué.

    J'ajouterai dans les pistes un problème de transaction
    Bonjour Sergio
    Je ne peux pas utiliser de trigger dans la mesure où dans certains cas je dois récupérer la clé renvoyée pour définir une relation maitre détail.
    Auriez vous du coup un exemple de mise en place a me proposer

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    4 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 4 034
    Points : 12 117
    Points
    12 117

    Par défaut

    Salut mballasse.

    Citation Envoyé par mballasse
    Je ne peux pas ajouter de contraintes clé primaire clé étrangère
    Pourquoi ?

    Citation Envoyé par mballasse
    Je ne peux pas utiliser de trigger dans la mesure où dans certains cas je dois récupérer la clé renvoyée pour définir une relation maitre détail.
    Un exemple détailé de ce que vous ne savez pas faire serait bienvenue.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  8. #8
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    juillet 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : juillet 2010
    Messages : 71
    Points : 46
    Points
    46

    Par défaut

    L'impossibilité de mettre en place des clés primaires et étrangères est imposée par un mécanisme de réplication multi sites (vieux de plus de 20 ans et qui fonctionne parfaitement) qui fonctionne en XML

    La question cocnernnat l'exemple est pour répondre à la problématique de l'appel via TRIGGER, je sais très bien faire fonctionner des relations maitre-détail via Delphi et Firedac, mais cela était pour répondre à la suggestion de SergioMaster

  9. #9
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    octobre 2002
    Messages
    2 027
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : octobre 2002
    Messages : 2 027
    Points : 3 297
    Points
    3 297

    Par défaut

    Bonjour,

    Citation Envoyé par mballasse Voir le message
    L'obtention de la clé se fait via un composant FireDac procédure stockée qui invoque simplement la procédure stockée de la base qui incrémente le générateur de 1.
    Je voudrais juste que vous nous donniez le source de cette procédure. Car votre problème n'a rien à voir avec le type de transaction que vous utilisez (sauf si effectivement votre procédure n'utilise pas ce qu'il faut pour générer des identifiants....)

  10. #10
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    juillet 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : juillet 2010
    Messages : 71
    Points : 46
    Points
    46

    Par défaut

    procedure stockée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SET TERM ^ ;
    CREATE PROCEDURE INCVERSION
    RETURNS (
        NUMVERSION Integer )
    AS
    begin
      NumVersion = Gen_Id (IncNumVersion,1);
      suspend;
      exit;
    end^
    SET TERM ; ^
    code Delphi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function Version_Id: integer;
     
     
    function TDtmPrincipal.Version_Id: Integer;
    begin
    	FDSPVersionTablette.Prepare;
    	FDSPVersionTablette.ExecProc;
     
    	Result := FDSPVersionTablette.ParamByName('numversion').AsInteger;
    end;

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    avril 2010
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2010
    Messages : 189
    Points : 425
    Points
    425

    Par défaut

    Bonjour,
    Citation Envoyé par mballasse Voir le message
    code Delphi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function Version_Id: integer;
     
     
    function TDtmPrincipal.Version_Id: Integer;
    begin
    	FDSPVersionTablette.Prepare;
    	FDSPVersionTablette.ExecProc;
     
    	Result := FDSPVersionTablette.ParamByName('numversion').AsInteger;
    end;
    Je n'utilise pas Firedac mais les IBX plus basiques (un IBSQL est suffisant, même en appelant directement gen_id, et ne nécessite pas de Prepare, mais un Close après lecture), pour la lecture du résultat on utilise FieldByName ou en plus rapide Fields[0].asInteger au lieu de ParamByName(..).asInteger.

    André

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    10 744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 10 744
    Points : 27 369
    Points
    27 369
    Billets dans le blog
    23

    Par défaut

    Bonjour,
    Citation Envoyé par alanglet Voir le message
    Je n'utilise pas Firedac mais les IBX plus basiques (un IBSQL est suffisant, même en appelant directement gen_id, et ne nécessite pas de Prepare, mais un Close après lecture), pour la lecture du résultat on utilise FieldByName ou en plus rapide Fields[0].asInteger au lieu de ParamByName(..).asInteger.
    Je suis d'accord, obtenir la valeur de l'incrément ne nécessite pas l'utilisation d'une procédure alors qu'un SQL SELECT Gen_Id (IncNumVersion,1) FROM RDB$DATABASEMais il est aussi possible après un SQL INSERT d'obtenir la valeur générée par le trigger en utilisant RETURNING, le seul truc avec Firedac/FDQuery est d'utiliser un Open ou un OpenOrExecute au lieu de ExecSQL
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

Discussions similaires

  1. [Lazarus] Problème de générateur de mots de passe
    Par absolutej dans le forum Lazarus
    Réponses: 6
    Dernier message: 10/02/2016, 17h21
  2. Problème avec générateur requêtes
    Par NOLISPU dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 09/11/2013, 20h37
  3. Problème lié au générateur de Code VBA
    Par tarbala dans le forum IHM
    Réponses: 1
    Dernier message: 23/11/2008, 04h40
  4. problème générateur de lettre .
    Par kimlaw95 dans le forum Langage
    Réponses: 2
    Dernier message: 15/04/2007, 14h37
  5. probléme de générateur
    Par krole57 dans le forum SQL
    Réponses: 3
    Dernier message: 17/07/2006, 10h05

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