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

Java EE Discussion :

Update concurrents sur une même table


Sujet :

Java EE

  1. #1
    En attente de confirmation mail
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2008
    Messages : 37
    Points : 22
    Points
    22
    Par défaut Update concurrents sur une même table
    Bonjour à tous,

    Mon application se bloque aléatoirement lorsque je fais un update sur ma base de données. Cette application fonctionne dans un environnement Glassfish 3.01, base de données MS SQL Server 2005 (driver sqljdbc4).

    Cet update se fait dans un BMT de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    utx.begin();
    entity.setEnabled(false);
    entity.setStatus(1);
    utx.commit();
    Il arrive que l'application se bloque lors du commit (au bout de quelques milliers d'update).

    A noter que l'application multi-thread et soumise à une grosse charge de travail : les accès concurrents à la base sont largement possibles, mais jamais sur la même ligne (chaque ligne n'est traitée qu'une fois). Y'a t il quelque chose à paramétrer pour que mon commit puisse se faire correctement ?

    Merci !

  2. #2
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut code ?
    Bonjour,

    Il manque une partie du code ?
    Des exceptions, dans les logs ?
    y a t'il un try .... catch ?

    tx.begin est une transaction, donc ... cela devrait fonctionner, peut être
    un time out ?

    sinon, si tous utilisent la même table pour un update @singleton + les @...
    qui vont bien pour gérer la partie transactionnelle .

    olivier

  3. #3
    En attente de confirmation mail
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2008
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    Merci olivier pour ta réponse,

    Il manque en effet une partie de code et des explications.

    Je suis dans un singleton et je travaille dans un try catch. Ma transaction fonctionne déjà avec un time out qui ne semble avoir aucun effet :

    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
     
    @Singleton
    @LocalBean
    public class ResultHandler
    {
      [...]
      try
      {
        synchronized(utx) // est ce raisonnable ?
        {
          utx.setTransactionTimeout(15);
          utx.begin();
          entity.setEnabled(false);
          entity.setStatus(1);
          utx.commit();
        }
      }
      catch(Exception e)
      {
        Logger.getLogger(ResultHandler.class.getName()).log(Level.INFO, "Erreur transaction [{0}]", e.getMessage());
      }
      [...]
    }
    Je n'ai aucune exception dans les logs, seulement une stacktrace récupérée avec jvisualvm : le thread bloqué attend dans la méthode read du SocketInputStream utilisé par le driver JDBC (le serveur SQL ne répond pas : problème de lock ?)

    Qu'entend tu par "+ les @... qui vont bien" ?

  4. #4
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut synchronized
    BOnjour,

    Il faut peut être utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @Singleton
    @ConcurrencyManagement(ConcurrencyManagementType.Bean)
    public class ...
    C'est dans la doc de glassfish, quand tu gères avec un méthode synchronized.

    ils nomment cela un BMC, Bean managed Conncurrency

    olivier

  5. #5
    En attente de confirmation mail
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2008
    Messages : 37
    Points : 22
    Points
    22
    Par défaut
    Ok je vais déjà essayer cela : je n'avais pas encore rencontré cette annotation.

    J'ai oublié d'évoquer le fait que mon bean avait l'annotation @TransactionManagement(TransactionManagementType.BEAN). Je le sous-entendais néanmoins par le BMT.

Discussions similaires

  1. accès concurrents entre 2 services distincts sur une même table
    Par grinder59 dans le forum Développement
    Réponses: 3
    Dernier message: 26/08/2011, 12h57
  2. [DEB] Sousform et Form sur une même table
    Par ip203 dans le forum IHM
    Réponses: 1
    Dernier message: 08/06/2006, 13h23
  3. Sum différents sur sur une même table ...
    Par Saloucious dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/10/2005, 15h51
  4. Réponses: 2
    Dernier message: 29/09/2004, 09h07
  5. jointure sur une même table
    Par guillaumeVb6 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/09/2004, 15h08

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