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

JDBC Java Discussion :

Comment optimiser mes recherches ?


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Femme Profil pro
    Developpeuse Java/Jee-Flex
    Inscrit en
    Novembre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Developpeuse Java/Jee-Flex

    Informations forums :
    Inscription : Novembre 2007
    Messages : 67
    Points : 43
    Points
    43
    Par défaut Comment optimiser mes recherches ?
    Bonjour,
    J'ai un fichier à lire et à enregistrer dans la db sous plusieurs tables.
    Mais avant l'insertion, je dois vérifier la présence des objets dans la db.
    • Si l'objet existe avec les même valeurs : rien faire
    • Si l'objet existe et un de ses attributs est modifié : faire l'update
    • Si l'objet n'existe pas : créer un nouvel objet


    Ma question est :
    Quelle est la bonne façon de faire en prenant en considération les performances ?

    J'ai pensé à suivre ce scénario :
    1. récupérer tous les objets de la base de données en se basant sur un attribut pour la recherche
    2. parcourir le résultat et le comparer avec le contenu du fichier et construire les objets
    3. faire l'update/création des objets de tous les éléments


    Qu'en pensez-vous ?

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Le mot performance, sans explication supplémentaire, ne veut rien dire. Il est souvent question de "temps de réponse rapide". Mais performance englobe l'usage de toutes les ressources de la machine : temps de réponse, occupation RAM, usage des disques durs, quantité de données échangées sur les interfaces réseaux, ...

    De manière générale, c'est une très mauvaise idée d'extraire toutes les données de la base de données et de travailler à l'extérieur. La base de données est faite pour ça : gérer les données. Alors il faut laisser travailler cette base de données.

    Tu ne donnes aucune info sur ton architecture ni sur tes contraintes. Alors je vais imaginer une solution possible qui pourra servir de base de discussion.

    Pour chaque table modifiable, tu vas créer une procédure stockée qui prend en argument tous les champs de la table. Les procédures stockées se chargent de vérifier les valeurs des champs et de les modifier dans une transaction si besoin.
    Chaque ligne de ton fichier d'entrées décrit une modification à apporter à une table. Alors pour chaque ligne, tu vas exécuter la procédure stockée associée à la table.

    Évidemment, tout dépend du volume des modifications par rapport aux tailles des tables à modifier. Si tu me dis que le fichier modifie la quasi-totalité des données des tables, alors il faudrait envisager une autre approche.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 62
    Points : 36
    Points
    36
    Par défaut
    etant donné que vous devez faire un update s'il les attributs sont different. Vous n'avez pas besion de faire parcourir toute la table pour faire des comparaison.
    En plus faire la comparaison colonne par colonne peut etre fastidieux.
    En fonction de votre persistance on peut utiliser une methode update pour faire une creation si l'objet n'existe pas.
    Si les attributs sont les memes il yaura pas d'incidences;
    Recuperer l'objet et faire juste un update.
    Maintenant si vous essayez de faire une creation et que ça ne passe pas. faite un find a partir de la clé. si l'objet existe faire un update dans le cas contraire faire un create

  4. #4
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Il y a plusieurs solutions qui dépendent beaucoup de l'identification des éléments en base : c'est quoi la clé primaire?

    Si l'objet existe avec les même valeurs : rien faire
    Si l'objet existe et un de ses attributs est modifié : faire l'update
    Si l'objet n'existe pas : créer un nouvel objet
    La première étape est de vérifier si l'objet existe en base, qu'il doive être mis à jour ou pas. Pour ça, il faut vérifier si la PK existe. Comme c'est une PK, ça passera forcement par un index donc ça sera super efficace et super rapide.
    Si la PK n'existe pas -> tu insère

    SINON, ça veut dire que tu dois vérifier si les données doivent être mises à jour.
    Et du coup, ça serait quoi le problème de faire l'update si les valeurs n'ont pas changé? A ce point, je ferais un update systématique sans vérifier les valeurs des colonnes pour être sûr.


    S'il y a des vraies problématiques de volumétrie (fichier énorme, très peu de lignes mises à jour), une solution rapide pour savoir si un objet doit être mis à jour est de passer par un hash : tu récupère le résultat du hash MD5 de la concaténation des valeurs de tes colonnes et du compares par rapport à tes données en entrée. Si c'est identique, y'a pas besoin de faire de mise à jour, sinon tu peux mettre à jour à partir de tes données en entrée.
    Je ne suis pas mort, j'ai du travail !

  5. #5
    Membre du Club
    Femme Profil pro
    Developpeuse Java/Jee-Flex
    Inscrit en
    Novembre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Developpeuse Java/Jee-Flex

    Informations forums :
    Inscription : Novembre 2007
    Messages : 67
    Points : 43
    Points
    43
    Par défaut
    Bonjour,

    Merci à vous tous pour vos propositions.

    Je n'ai pas acces à la clé primaire(sachant que je travaille avec JPA) par contre on a une autre clé fonctionnelle unique.
    J'ai pensé à la solution de créer une table temporaire où j'intege le fichier en totalité et ensuite supprimer l'ancienne table et renommer la nouvelle .mais celà va falsifier les donnees puisque ma table est lié aux autres tables.

    A ma connaissance parser ligne par ligne n'est une bonne idée . par rapport aux colonnes je ne compte pas à chercher la difference. j'insere ou je fais un update de l'objet en totalité.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/08/2009, 20h58
  2. Réponses: 6
    Dernier message: 23/04/2009, 10h07
  3. [CF][C#] Comment optimiser mes requêtes avec SqlCE ?
    Par david71 dans le forum Windows Mobile
    Réponses: 10
    Dernier message: 20/01/2006, 14h48
  4. Comment optimiser une jointure ?
    Par seb_asm dans le forum Administration
    Réponses: 21
    Dernier message: 25/06/2004, 16h42
  5. Comment supprimer 'mots recherchés'?
    Par bucky dans le forum Windows XP
    Réponses: 3
    Dernier message: 04/12/2003, 17h06

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