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

JPA Java Discussion :

Multi-thread et lazy loading


Sujet :

JPA Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 34
    Points : 43
    Points
    43
    Par défaut Multi-thread et lazy loading
    Salut à tous,
    J'ai un petit problème dans l'utilisation de jpa dans un contexte multi-thread.

    C'est la première fois que je me lance dans ce genre de chose donc peut-être que je n'ai pas réellement compris le principe de fonctionnement, ce qui expliquerait mes erreurs!

    Voila, j'aimerais lancer un traitement en parallèle dans plusieurs threads : je précise que ces traitements font uniquement de la lecture en bdd et génère des fichiers à partir de ces données (le problème de synchronized sur les lectures/écritures en bdd ne se posent à priori pas pour le moment).

    Voici mon code :
    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
    List<LivrableVO> fichiers;
    private void genererFichiers() {
        try {
            fichiers = gestionFichiersService.recupererFichiersByEtat(Etat.EXTRAIT);
            if ((fichiers != null) && (fichiers.size() > 0)) {
                int nbFichiers = fichiers.size();
                // Calcul du nombre de thread à lancer
                int nbThreads = nbLivrables / 2;
                if (nbThreads > NB_THREAD_MAX) {
                    nbThreads = NB_THREAD_MAX;
                }
     
                LOG.debug("Lancement de " + nbThreads + " threads...");
                threads = new Thread[nbThreads];
                int nb = 0;
                for (nb = 0; nb < nbThreads; nb++) {
                    LOG.debug("Lancement thread n°" + (nb + 1));
                    threads[nb] = new Thread(new ThreadRelookingFacture());
                    threads[nb].start();
                }
     
                // On attend que chaque thread ait finit
                for (nb = 0; nb < nbThreads; nb++) {
                    threads[nb].join();
                }
            }
        } catch (InterruptedException ex) {
            LOG.error(ex);
        }
        LOG.debug("Fin génération des fichiers");
    }
     
    private synchronized LivrableVO getFacture() {
        if ((fichiers != null) && (fichiers.size() > 0)) {
            LivrableVO livrableVO = fichiers.get(0);
            fichiers.remove(0);
            return livrableVO;
        }
        return null;
    }
     
    public class ThreadRelookingFacture extends Thread {
     
        public void run() {
             LivrableVO livrableVO = getFichier();
             if (livrableVO != null) {
                 while (livrableVO != null) {
                     try {
                          relookingApp.genererFichier(livrableVO, false);
                     } catch (FunctionnalException ex) {
                          LOG.error(ex);
                     } catch (TechnicalException ex) {
                         LOG.error(ex);
                     }
     
                     livrableVO = getFacture();
                }
            }
        }
    }
    Quand je rentre dans relookingApp.genererFichier, ma fonction va faire une requête en base pour récupérer des infos, le problème est que je me retrouve avec une LazyLoading Exception.
    A noter que si je fais le même traitement sans créer de thread (et donc exécution de tout le traitement dans le thread courant), tout marche parfaitement.

    Que faut-il faire pour gérer correctement le contexte de persistence dans mes threads ?
    C'est la première fois que je fais ce genre de chose et je n'ai pas trouvé grand chose pour le moment.
    Je suis preneur de toute remarque/idée si vous voyez un problème de conception!

    Merci d'avance.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Ton problème de lazy exception n'est pas directement lié à l'utilisation de tes threads, mais plutôt à ta gestion de la session/transaction.
    Si tu ne veux pas avoir cette erreur, il faut que tu charges ta collection avant de sortir de la portée de ta session.
    Fais une recherche sur le forum, cette question revient souvent.

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. Réponses: 2
    Dernier message: 15/05/2004, 18h33
  3. Réponses: 16
    Dernier message: 30/01/2004, 11h05
  4. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 12h01
  5. [Kylix] exception qtinft.dll et multi-threading
    Par leclaudio25 dans le forum EDI
    Réponses: 3
    Dernier message: 27/03/2003, 18h09

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