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

Développement Web en Java Discussion :

Calcul de moyenne et accès concurrents


Sujet :

Développement Web en Java

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 53
    Points : 176
    Points
    176
    Par défaut Calcul de moyenne et accès concurrents
    Bonjour,

    je souhaiterais avoir votre avis sur le problème suivant :
    je suis entrain de créer un site contenant une liste de produits que les internautes peuvent noter. Une note moyenne est calculée pour chaque produit, à partir de l'ensemble des notes des internautes.

    Question : à quel moment faut-il que je calcule cette moyenne ? Au moment où l'internaute met sa note, ou via un batch qui tournerait toutes les nuits par exemple ?
    Le problème est que si je calcule la moyenne au moment de l'enregistrement de la note, il y a le risque que 2 internautes notent au même moment, et que le calcul soit erroné.

    J'ai déjà réfléchi aux solutions suivantes, pouvez-vous me dire quelle est la plus adaptée :
    - mettre le mot clé "synchronized" sur la méthode qui sert à calculer la moyenne, afin d'éviter les accès simultanés.
    - créer un batch (comme dit précédemment) qui va calculer les moyennes toutes les nuits.
    - au moment d'enregistrer la note, faire un traitement asynchrone pour calculer la moyenne en arrière-plan (en mettant toujours un "synchronized")
    - mettre des locks en base de données

    Quelle est selon vous la meilleure solution ?

    Merci beaucoup !

  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
    Dans l'hypothèse ou les notes et la moyenne sont stockées en base de données et que ta base de données accepte les transactions, alors aucune hésitation : tu ouvres une transaction, tu ajoutes la nouvelle note et tu calcules la nouvelle moyenne puis tu commit la transaction.
    Le batch est une mauvaise idée car il ne résout pas le problème d'accès concurrent si deux nouvelles notes sont ajoutées en même temps. De plus, c'est du code à maintenir dans un traitement distinct. Enfin, il n'y a plus l'aspect "affichage immédiat suite à action de l'utilisateur", ça pourrait être déroutant.
    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
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 53
    Points : 176
    Points
    176
    Par défaut
    Merci pour ta réponse
    Toutefois les transactions ne s'appliquent pas à mon problème pour ce cas précis. Admettons que j'ai la table "produit" et "note" comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    produit : idProduit, nomProduit, noteMoyenneProduit
    note : idNote, idInternaute, idProduit, noteProduit
    (bon évidemment ça sera un peu plus complexe, d'ailleurs pour recalculer la moyenne il me faudra la somme des notes et leur nombre total pour pouvoir faire somme/nombre = moyenne)

    L'internaute met donc sa note, qui elle apparaîtra tout de suite dans la liste des notes du produit (en dessous du produit on affiche la note attribuée par chaque internaute). Donc jusque-là pas de problème.

    En revanche, il faut calculer la moyenne à partir de toutes les notes. Pour le calcul pas de soucis, je récupère le produit, je recalcule la moyenne et je le ré-enregistre. Donc le problème est le suivant :
    si je recalcule la moyenne du produit au moment où l'internaute met sa note, il faut que je fasse le traitement en 2 temps : 1) j'enregistre la note dans la table "note" 2) je recalcule la moyenne et je l'enregistre dans la table "produit". Mais si 2 internautes enregistrent leur note au même moment (au millième de seconde près) le recalcul de la moyenne ne sera pas correct puisqu'il y a le risque que l'une des 2 notes ne soit pas prise en compte dans le calcul (accès concurrent).


    Je pense que le problème est un peu plus clair ainsi ?

  4. #4
    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
    La transaction s'applique tout à fait à ton problème et est faite pour ça :
    1. ouvrir transaction
    2. placer la nouvelle note dans la table "note"
    3. calculer la nouvelle moyenne et l'enregistrer dans la table "produit"
    4. commit de transaction
    5. afficher la note de l'utilisateur
    6. afficher la moyenne
    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.

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 53
    Points : 176
    Points
    176
    Par défaut
    Je ne comprends pas en quoi une transaction peut m'aider, étant donné que plusieurs utilisateurs peuvent ouvrir des transactions simultanément et faire des commit en base de données simultanément également.

    A moins qu'il y ait quelque chose qui m'échappe

  6. #6
    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
    Citation Envoyé par icexplorer Voir le message
    A moins qu'il y ait quelque chose qui m'échappe
    Une transaction est une action atomique du point de vue extérieur à la base de données, peu importe le nombre d'actions réalisées dans cette transaction. La base de données assure de conserver l'intégrité technique (et fonctionnelle si ton programme est correcte) de tes données.
    Si tu effectues le calcul de moyenne comme expliqué précédemment, tu seras assuré d'avoir une moyenne toujours correcte et des données en base correctes également.
    Je t'encourage vivement à lire de la documentation sur les transactions appliquées à la base de données que tu utilises
    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.

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 53
    Points : 176
    Points
    176
    Par défaut
    J'ai commencé à lire ce document sur Hibernate :
    http://docs.jboss.org/hibernate/core...nsactions.html
    qui explique notamment comment gérer les accès concurrents au niveau des transactions.

    Donc maintenant j'ai une meilleure idée sur la solution à adopter.
    Passage à résolu

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

Discussions similaires

  1. methode qui calcul une moyenne du traffic
    Par siry dans le forum Développement
    Réponses: 7
    Dernier message: 05/05/2005, 17h16
  2. calculer une moyenne avec une requete externe
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 16h02
  3. Lenteur et acces concurrent
    Par JeanMarc_T2k dans le forum Bases de données
    Réponses: 7
    Dernier message: 04/12/2004, 20h57
  4. acces concurrent avec delphi 5 entreprise
    Par Jean_paul dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/11/2004, 20h19
  5. [EJB] Accès concurrents à la base de données
    Par cameleon2002 dans le forum Java EE
    Réponses: 10
    Dernier message: 23/09/2003, 11h31

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