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 :

Comment minimiser le trafic réseau entre appli et serveur ?


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 21
    Points : 13
    Points
    13
    Par défaut Comment minimiser le trafic réseau entre appli et serveur ?
    Bonjour à toutes et tous,

    Voici quelques questions qui écourtent mes nuits sur la meilleure façon de minimiser le trafic réseau entre une appli Delphi et une base de données (SQL Serveur 2000) sans toutefois générer une usine à gaz. Merci d’avance pour vos conseils.

    Pour donner un cadre concret à mes questions, imaginons que l’on ne gère qu’une seule table : des individus (Id, nom, prénom, age, sexe …).
    L’objectif est de construire une appli avec deux forms : La liste des individus et la fiche d’un individu.

    La solution la plus simple consiste bien sur à utiliser sur mes deux forms des objets ContrôlesBD. Un DbGrid pour la liste et des DBEdit pour la fiche.
    Cependant, dans ce cas, après avoir modifié les données sur un individu (ou ajouté un individu), la seule solution (à ma connaissance) pour actualiser la liste est de ré-interroger la source de données. Pas très bon pour ce qui est de minimiser le trafic réseau et la charge serveur !

    J’ai donc opté pour une solution qui consiste à ne pas utiliser de DBGrid pour ma liste mais plutôt une ListView. Je charge celle-ci une première fois à partir d’une table ou d’une requête. Lors de la validation de la modification (ou l’ajout) d’un individu au travers de la fiche, j’appelle une méthode de ma liste en lui transmettant tous les paramètres sur l’individu (Id, Nom, Prénom, …). Cette procédure modifie (ou génère) l’item de l’individu dans la ListView.
    La ListView est donc bien actualisée sans trafic réseau.
    Cependant cette solution n’est pas réellement satisfaisante :

    - Il faut implémenter les méthodes (update et insert) parfois complexes pour la ListView,
    - La ListView n’offre pas toutes les options disponibles avec une DbGrid (autre que celle de Delphi) comme par exemple, le trie sur chaque colonne, la possibilité pour l’utilisateur de déplacer les colonnes, …..

    Avez-vous d’autres solutions que les deux évoquées ci-dessus.

    J’ai bien d’autres questions sur le même thème mais afin de ne pas surcharger ce post je vous les exposerais + tard.

    Merci.

  2. #2
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Bonjour,

    En supposant que tu aies vraiment beaucoup de données dans ta base, il faut déjà noter que pour les situations éventuelles de recherche, il te faudrait utiliser DisablesControls et EnablesControls pour empêcher les ensembles de données sous-jacent à s'actualiser chaque fois.

    De plus, pour ce qui est de la mise à jour, il t'est possible d'utiliser les ensembles de données client comme TClientDataset pour mettre les données en cache et les actualisés au fur et à mesure. Ce que je veux dire est que tu gères l'évènement onUpdateRecord du cet ensemble de données et tu ne mets à jour que ceux qui ont été modifiés (ils auront leu champ updateKind à ukModify); cà t'évite d'avoir à rapatrier chaque fois tout l'ensemble de donnée...

    L'utilisation de procédures stockés permet aussi de minimiser le traffic réséau.

    Pour ce qui est de l'utilisation des composants non connectés, je n'ai jamais essayé de les utiliser à la place des composants usuels (comme le DBgrid).

  3. #3
    Mjm
    Mjm est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 69
    Points : 122
    Points
    122
    Par défaut
    Bonsoir,
    Problème effectivement crucial et que l'on gère mal si on avait utilisé le BDE aupravant. J'ai une applic dont la table principale contient 310000 "articles" avec ajout de 150 par jour environ, ces articles on bien sùr des dépendances dans d'autres tables.
    Donc :
    1 - le rapatriement des 310000 articles dans une DBgrid est inanvisageable. Donc necessité de faire des requètes fines pour limiter l'import. Là j'enfonce des portes ouvertes !!!!
    2 - Et c'est sans doute plus bizarre, je n'utilises JAMAIS de composants visuels DBAware !!!. C'est un peu plus compliqué au début mais je m'y retrouve en maintenance.
    Je crée un "object Article" (ou une liste d'"objects" éventuellemnt capable de se charger seulle par une méthode appropriée) et je travaille sur les objets. Je n'update ensuite dans la base que les objets modifiés.
    Pour les listes je crée une liste dans une listbox (que j'ai un peu améliorée) et j'insère les lignes par un
    Lb.Items.AddObject...
    Quand je clique la ligne j'ai ainsi instantanément l'"object article" que je peu modifier, détruire etc. etc. Si besoin je rafraichi ma listbox grace à ma liste d'objets en mémoire. C'est rapide et peu visible avec un LB.Item.Beginupdate et un Lb.Item.endUpdate en fin.
    J'espère que mes explications ne sont pas trop confuses

  4. #4
    Membre à l'essai
    Inscrit en
    Septembre 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Merci pour vos réponses,

    La problèmatique de Mjm est identique à la mienne. La solution aussi ...
    Je charge mes enregistrements dans des records. L'ensemble des records ainsi créés est référencé dans une TList.
    Ce traitement est réalisé dans une procédure bien spécifique.
    Pour l'affichage, j'utilise un TListItem en affectant à chaque item son record associé (Propriété Data).

    Je trouve cependant deux inconvénients à cette méthode :
    Beaucoup + de code donc de temps de dev et de risque de bugs,
    Cette méthode est à l'opposé de la philo des appli web de type Asp. En effet, dans ce type d'appli, la page de la liste est systématiquement re-demandée au serveur (La charge serveur et réseau est bien sur + grande). Le passage de mon appli actuelle en version Web va donc demander un re-developpment complet !!!

    Delphi+

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/05/2010, 13h04
  2. Réponses: 1
    Dernier message: 25/01/2008, 14h44
  3. Réponses: 3
    Dernier message: 05/05/2004, 10h23
  4. Comment gérer ma carte réseau en ASM
    Par will1974 dans le forum Assembleur
    Réponses: 6
    Dernier message: 23/09/2003, 17h08
  5. Communiccation entre Appli
    Par mr_titi dans le forum C++Builder
    Réponses: 3
    Dernier message: 23/06/2003, 17h19

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