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

Bases de données Delphi Discussion :

Fermeture d'une BDD Interbase, très longue


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut Fermeture d'une BDD Interbase, très longue
    Bonjour.

    J'ai développé un projet de facturation avec INTERBASE + DELPHI 7.
    Ma base de données contient 25 tables. L'exécutable est FACT.EXE.

    Mon probléme est les suivant :

    Quand je sort du projet avec et je veux ouvrir une deuxiéme fois , le projet ne s'ouvre plus parce qu'il
    y'a deux processus en cours de FACT.EXE (voir avec CTL-ALT-SUPPR).

    D'aprés ma logique c'est la connexion à ma base de données qui n'est pas
    encore libérée (IBDATABASE1.OPEN). Mais quand je fais IBDATABASE1.CLOSE
    avant application.terminate ça prend beaucoup de temps mais ça résoud le probléme car il est mis fin au processus FACT.EXE.

    Ma question : Est il possible de mettre fin à mon processus FACT.EXE
    rapidement pour sortir plus vite du projet ?

    Une sortie rapide est plus agréable qu'une sortie lente

    Merci à tous.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    J'ai plus d'une application avec beaucoup plus de 25 tables et Querys et n'ai jamais rencontré ce problème . Il me semble que si
    D'aprés ma logique c'est la connexion à ma base de données qui n'est pas
    encore libérée (IBDATABASE1.OPEN). Mais quand je fais IBDATABASE1.CLOSE avant application.terminate ça prend beaucoup de temps
    c'est qu'il y a dans le programme des transactions mal fermées
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    Je n'utilise pas de transactions et ma base est en mode serveur locale.

    Mon problème c'est pourquoi j'ai toujours l'exécutable dans le gestionnaire des
    taches aprés application.terminate ? Est ce qu'il faut fermer toutes les tables
    et la base de données avant de sortir ?

    Dit moi comment faire pour rentrer et sortir rapidement de mon application ?

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par HASSIOMAR Voir le message
    1. Je n'utilise pas de transactions et ma base est en mode serveur locale.
    2. Est ce qu'il faut fermer toutes les tables et la base de données avant de sortir ?
    1- Cela n'a rien a voir avec les transactions sur le serveur de BDD , et d'ailleurs quels composants sont utilisés ? et quelles options de connexion

    2- C'est quand même plus propre
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    La gestion des transactions doit être faite par l'application cliente, et donc de la responsabilité du développeur, que l'on soit en local ou en C/S.

    Si tu utilises les composants IBX, tu utilises certainement une transaction par défaut qui reste ouverte pendant toute la durée de vie de l'application.
    Toutes tes requêtes de sélection et de mise à jour s'accumulent dans cette celle-ci.

    Et lorsque que tu quittes l'application, la transaction effectue l'action par défaut (taCommit), ce qui ne se fait pas en une milliseconde.

    Donc pour conclure, utiliser le comportement par défaut des composants IBX est une très mauvaise façon de procéder.

    @+ Claudius

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    A part le composant IBtransaction1 je n'ai pas aucune transaction ailleurs.

    En sortant de l'application ..... pourquoi mon exécutable reste dans le gestionnaire des taches ?

    Exemple : Quand on ouvre EXCEL, EXECL.EXE rentre dans le gestionnaire des
    taches comme processus, mais quand on ferme EXCEL ce
    processus disparait immédiatement .

    Comment fermer par défaut toutes les transactions eventuelles du projet ?

  7. #7
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 188
    Points : 113
    Points
    113
    Par défaut
    Pourquoi tu fais : "application.terminate"
    et non un "close" ?

  8. #8
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    Tout simplement parce que c'est la premiere Form de l'application qu'il faut
    quitter avec . c'est le langage DELPHI.

    J'ai essayé close , le problème existe toujours.

    J'ai revu mon source et j'ai fermé toutes les requêtes SQL utilisées avec IBQUERY.CLOSE ça va mieux maintenant la sortie est trés rapide.

    Le seul problème qui reste maintenant c'est quand je sort de l'application et je
    réouvre immédiatement , là cà prend assez de temps. Ma logique me dit
    que quelque part la connexion à la base de données n'est pas totalement libérée.

    Dans mon module de données j'ai :

    IBDatabase1.connected := true;
    IBTable1.active:=true
    IBTable2.active:=true
    ............................
    IBTable25.active:=true

    Est ce qu'il y a probléme avec cette configuration en sortant de l'application ?

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par HASSIOMAR Voir le message
    Tout simplement parce que c'est la premiere Form de l'application qu'il faut
    quitter avec . c'est le langage DELPHI.
    première nouvelle ! soit il faut que je revoie tous mes programmes soit il va falloir revoir ta position ! Un Close d'une forme principale ferme bien l'application .

    J'ai essayé close , le problème existe toujours.
    le close comme le application.terminate ne corrige certainement pas des problèmes de transaction

    J'ai revu mon source et j'ai fermé toutes les requêtes SQL utilisées avec IBQUERY.CLOSE ça va mieux maintenant la sortie est trés rapide.
    enfin on avance

    Le seul problème qui reste maintenant c'est quand je sors de l'application et réouvre immédiatement , là ça prend assez de temps. Ma logique me dit que quelque part la connexion à la base de données n'est pas totalement libérée.
    logique implacable

    Dans mon module de données j'ai :

    IBDatabase1.connected := true;
    IBTable1.active:=true
    IBTable2.active:=true
    ............................
    IBTable25.active:=true

    Est ce qu'il y a probléme avec cette configuration en sortant de l'application ?
    il y a surtout un problème d'utilisation des IB je pense , il m'étonnerait qu'une fiche appelle 25 tables , que celles-ci soit toutes en lecture/écriture et aient toutes besoins d'être ouvertes au début

    Beaucoup de ménage dans le programme me semble indispensable
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    Ma tactique à moi c'est d'ouvrir la base au démarrage de l'application pour travailler et lancer mes requêtes sans se soucier de l'ouverture de tel ou tel table.

    Mon erreur à moi c'est que j'oublie de fermer ma base en sortant et c'est pour cette raison que mon executable reste dans le gestionnaire de taches.

    Aprés un petit réaménagement de mon source :

    1 - Fermer toutes les réquêtes utilisées avec IBQUERYi.CLOSE;
    2 - Fermer la base de données en sortant avec IBDatabase1.close;
    (Deux minutes au maximum ... le temps de sortie ).

    J'aimerai bien une sortie instantanée ....... mais deux minutes c'est acceptable
    aussi ........... Le temps de faire une petie pause.

    Un autre besoin apparait maintenant c'est comment faire clignoter un message
    sur un label du genre :
    'BASE DE DONNEES EN COURS DE FERMETURE...PATIENTEZ S.V.P'.

    Afin d'attirer l'attention de l'utilisateur sur l'opération en cours .

    Et merci à tous pour vos précieuses orientations.

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par HASSIOMAR Voir le message
    Ma tactique à moi c'est d'ouvrir la base au démarrage de l'application pour travailler et lancer mes requêtes sans se soucier de l'ouverture de tel ou tel table.
    je ne pense pas que ce soit la bonne tactique

    mais deux minutes c'est acceptable
    Non , c'est inacceptable
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    Si deux minutes sont inacceptable ... dites moi comment faire pour avoir

    une deconnexion rapide ( deux secondes pour vous faire plaisir) avec.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     IBDatabase1.connected:=false;
    Y'a t il une autre façcon de se déconnecter de la base ?

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Pour moi le problème est dans la méthode utilisée pour accéder aux données . Cette 'Tactique' d'ouvrir toutes les tables au démarrage de 'application est aberrante . Dans un contexte réseau local et multi-utilisateurs , je n'ose imaginer les problèmes possibles


    Même mes vieilles appli BDE de facturation prennent moins longtemps a fermer .
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Il semble indispensable de revoir la structure !

    Pense qu'un TIBTable comme il fonctionne sur une base distante à une tendance à charger tous les enregistrements en mémoire
    Il doit y avoir tout de même un système de paquet pour une récupération progressive, peut-être même un mode asynchrone

    Tu peux au démarrage de l'application, faire un Prepare de quelques TIBQuery cruciaux (ceux fréquemment utilisé, comme la recherche d'un client par son nom, prénom, numéro ou une commande), la préparation suppose l'utilisation de SQL avec Paramètres
    La Préparation explicite permet de passer de 5-10ms la requête à 1ms ou quelques centaines de µs
    Pour les autres, des TIBQuery créées à la volée avec un SQL étudié pour ne fournir qu'une plage limitée de données (on ne va pas récupérer un journal de compta contenant des millions de lignes pour rien)

    Je suppose que IBTable1 à IBTable25 n'est qu'un exemple pour nous, tu as des noms plus évocateurs dans le code réel ?
    Quelle est le volume des données ?
    Un logiciel de Facturation semble-t-il, tout dépend l'utilisateur, j'en ai migré un de DBase à MySQL, il a fallu repenser certains éléments comme les Listings, récupérés 300 000 clients en SQL est bien trop long (augmente le flux réseau, la RAM consommé côté Server le temps du SQL et côté client tout le temps de vie de l'objet Query)
    Même principe pour le journal de comptabilité, cela affichait tout et positionnait via un Filter ou Locate, par de soucis en DBase bien plus en MySQL (même principe que InterBase un SGBD distant accessible en TCP\IP)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  15. #15
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    Ma base est en serveur locale.
    Le nbre enregistrement est 100.
    Ma question qui m'intrigue , pourquoi l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IBDatabase1.connected:=false
    prend assez de temps (Dans mon cas entre 1mn 30s et 2mn) ?
    Alors que les IBTablei.close sont instantanées.

    Même si j'ai une seule fiche avec le même DATAMODULE , quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IBDatabase1.connected:=false
    ça prend le même temps.
    Donc ça n'a aucune relation avec le programme pascal , Le pbm se trouve
    quelque part dans dans la configuration du SGBD interbase.

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par HASSIOMAR Voir le message
    Donc ça n'a aucune relation avec le programme pascal , Le pbm se trouve
    quelque part dans dans la configuration du SGBD interbase.
    Ou :
    - ça a à voir avec le mode d'ouverture
    - La base de données est corrompue
    - il y a toujours plein de transactions (fantômes ou limbo) en cours dans la base (ce qui a à voir avec le mode d'ouverture) .

    Suggestion d'essai :
    - backup de la BDD
    - restore de la BDD
    - test du programme d'essai

    mais aussi un changement du titre du message principal , puisqu'il ne s'agit pas vraiment de tuer un processus mais de fermer une BDD Interbase rapidement
    suggestion : Fermeture d'une BDD Interbase , très longue
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  17. #17
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Suggestion d'essai :
    - backup de la BDD
    - restore de la BDD
    - test du programme d'essai
    J'ajouterais à ceci qu'il serait également intéressant d'examiner au préalable les stats de cette BDD avec gstat.

  18. #18
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 138
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par HASSIOMAR Voir le message
    1 - Fermer toutes les réquêtes utilisées avec IBQUERYi.CLOSE;
    2 - Fermer la base de données en sortant avec IBDatabase1.close;

    Êtes vous sûr d'avoir fermer tous les ibquery avant de faire IBDatabase1.close.
    Parce que dans mon cas si j’oublie de fermer une seul table ou une seul requête (avant de fermer ma base)mon programme prend un temps fou à se fermer , Alors que dans le cas contraire ça se fait en quelques secondes, Vérifiez bien

  19. #19
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Tu utilises Interbase 6.0 ?
    Si ton PC n'est pas une viellerie il sera au minimum en dual core. IB6.0 est notoirement connu pour ne pas fonctionner correctement avec plus d'un processeur sur le PC. Les connexion sont longues (les deux minutes que tu obients) même en local avec une base de rien du tout (100 enregistrements c'est néligeable).

    Si c'est le cas ajoute cette unité au projet :
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    unit UIBAffinity;
     
    // Sources du code :
    // http://www.ait-augsburg.de/downloads.htm
    // http://nono40.developpez.com/sources/source0051/
    //
     
    interface
     
    {$WARN SYMBOL_PLATFORM OFF}
    procedure TestMasqueIBServeur(Change,Afficher:Boolean);
     
    implementation
     
    Uses Windows,SysUtils,Dialogs;
     
    Function _AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
      NewState: PTokenPrivileges; BufferLength: DWORD;
      PreviousState: Integer; ReturnLength: Integer): BOOL;stdcall; external advapi32 name 'AdjustTokenPrivileges';
     
    Function LoggedSetPrivilege ( hProcess:THANDLE;Droit:String;bEnable:Boolean):Boolean;
    Var
      Info  : TTokenPrivileges;
      Token : THandle;
      Res   : Boolean;
    Begin
      // Ouverture des droits du compte
      Res := OpenProcessToken ( hProcess,TOKEN_ADJUST_PRIVILEGES,Token);
     
      If Not Res Then
      Begin
        ShowMessage('Ouverture des droits impossible' );
        Result:=False;
        Exit;
      End;
     
      // Enable ou disable?
      Info.PrivilegeCount := 1;
      If  bEnable
        Then Info.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
        Else Info.Privileges[0].Attributes := 0;
     
      // Obtenir le LUID du droit dont on veut changer l'état.
      Res := LookupPrivilegeValue ( Nil,Pchar(Droit),Info.Privileges[0].Luid);
      If Not Res Then
      Begin
        ShowMessage('Impossible d''obtenir le LUID de '+Droit );
        Result:=False;
        Exit;
      End;
     
      // Modification du droit
      Res := _AdjustTokenPrivileges ( Token, FALSE,@Info, 0, 0, 0);
      If Not Res Then
      Begin
        ShowMessage('Impossible de modifier le droit, erreur '+IntToStr(GetLastError));
        Result:=False;
        Exit;
      End
      Else
      Begin
        If GetLastError<>ERROR_SUCCESS Then
        Begin
          ShowMessage('Impossible d''activer le droit '+Droit+', vérifiez la gestion locale des comptes.');
          Result:=False;
          Exit;
        End;
      End;
     
      CloseHandle( Token );
     
      Result:=True;
    End;
     
    procedure TestMasqueIBServeur(Change,Afficher:Boolean);
    var
      ProcessHWND          : THandle;
      ProcessID            : DWORD;
      ProcessHandle        : THandle;
      ProcessAffinityMask  : DWORD;
      SystemAffinityMask   : DWORD;
      Access               : DWord;
    Const
      process_class_name: string = 'IB_Server';
      process_window_name: string = 'InterBase Server';
    begin
      //check NT is running
      if Win32Platform <> VER_PLATFORM_WIN32_NT then
      Begin
        ShowMessage('Sous Win9X ce test est inutile !');
        Exit;
      End;
     
      //find running process
      ProcessHWND := FindWindow(PChar(process_class_name), PChar(process_window_name));
      If ProcessHWND=0 Then
        Raise Exception.Create('Le process '+process_class_name+' n''est pas trouvé, vérifier que le serveur est bien lancé !');
     
      //Obtention de l'ID du process
      If GetWindowThreadProcessId(ProcessHWND, @ProcessID) = 0 then RaiseLastOSError;
     
      // Il faut demander les droits de 'debug' pour accéder aus infos sur les processeurs
      LoggedSetPrivilege(GetCurrentProcess,'SeDebugPrivilege',True);
     
      // get handle of then process
      Access := PROCESS_QUERY_INFORMATION;
      If Change Then Access := Access or PROCESS_SET_INFORMATION;
      ProcessHandle := OpenProcess(Access, false, ProcessID);
      if ProcessHandle = 0 then RaiseLastOSError;
      try
        //query current affinity mask
        Win32Check(GetProcessAffinityMask(ProcessHandle, ProcessAffinityMask, SystemAffinityMask));
        If Afficher Then
          ShowMessage(Format('Masque courants : Système=%d, Process=%d', [SystemAffinityMask , ProcessAffinityMask]));
     
        if Change then
        begin
          Win32Check(SetProcessAffinityMask(ProcessHandle, 1 and SystemAffinityMask));
          If Afficher Then
          Begin
            Win32Check(GetProcessAffinityMask(ProcessHandle, ProcessAffinityMask, SystemAffinityMask));
            ShowMessage(Format('Masque changés : Système=%d, Process=%d', [SystemAffinityMask , ProcessAffinityMask]));
          End;
        End;
      finally
        CloseHandle(ProcessHandle);
      end;
     
      // On rend en fin les droits de 'debug'
      LoggedSetPrivilege(GetCurrentProcess,'SeDebugPrivilege',False);
    end;
     
    end.
    Puis au début de ton programme avant toute connexion à ta base ajoute la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestMasqueIBServeur(True,False);
    EDIT : PS : je plussoie tout ce qui a été dit plus haut concernant les transactions, l'ouverture de trop de chose au départ, etc.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  20. #20
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    ça va mieux maitenenant , le temps de réponse est réduit entre 0 et 30 secondes. J'ai appliqué vos conseils qui sont :

    1 - Fermeture des tous les IBQUERY utilisés dans le programme source
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     procedure TForm31.FormClose(Sender: TObject; var Action: 
         TCloseAction);
         begin
          Form31.IBQUERY1.Active:=FALSE;
         CLOSE;   
         end;
    .

    2 - Lancement de maintenance de la base de données.
    Envoyé par SergioMaster
    Suggestion d'essai :
    - backup de la BDD
    - restore de la BDD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
          echo Reparation de la base ...
          gfix -m -i -user SYSDBA -password masterkey base_paie.gdb  
          echo Extraction des donnees ...
          gbak -g -b -z -v -l -user SYSDBA -password masterkey base_paie.gdb    
          base_paie.gbk
          echo Regeneration automatique des donnees ...
          gbak -c -v -z -r -user SYSDBA -password masterkey base_paie.gbk    
          base_paie.gdb
    3 - En quittant le projet faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         Dm1.IBDatabase1.Connected:=false;
    Conclusion -----> Faire des Backup et Restore de la base est trés important.
    çà rajeunit la base ?
    Merci à tous pour votre participation ...................................... à bientot.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/10/2009, 07h00
  2. WL9 : Pb avec une action struts très longue
    Par spirodeau dans le forum Weblogic
    Réponses: 1
    Dernier message: 30/07/2009, 10h19
  3. Exécuter une requête SQL très longue
    Par coraziari_l dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 10/01/2008, 17h07
  4. ajouter un utilisateur comme administrateur d'une BDD Interbase
    Par passion_info dans le forum Bases de données
    Réponses: 1
    Dernier message: 30/11/2006, 08h42
  5. Import d'une bdd éloquence avec interbase ou postgresql?
    Par Missvan dans le forum InterBase
    Réponses: 11
    Dernier message: 06/01/2004, 21h44

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