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

Persistance des données Java Discussion :

Persistance Best Practice


Sujet :

Persistance des données Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de bricecol
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 364
    Par défaut Persistance Best Practice
    Bonjour à tous.

    Ma question aujourd’hui n'est pas technique (enfin pas vraiment) mais plutôt sur la bonne manière de faire.

    Je pose rapidement le cadre du projet : Projet J2EE + ZK Framework + ActiveObjects (persistance)
    Le projet est destiné a être utilisé par un nombre important de personne en même temps et le diagramme UML est conséquent et assez complexe.

    J'ai créé un "point d'entré" unique pour l'application (un singleton nommé Application). L'idée est d'accéder à partir de celui-ci aux Factories, Controllers et diverses constantes...

    Ma question concerne l'EntityManager.
    Actuellement, Application créé un EntityManager unique, partagé sur toute l'application.
    Est-ce que c'est la bonne façon de faire ?
    Peut-il y avoir des utilisations concurentes (et dans ce cas dois-je synchroniser son utilisation ou créer un EntityManager par DAO/Controller ?).

    Malheureusement je n'ai pas assez de connaissance sur l'environnement J2EE/Tomcat. Je ne demande qu'à apprendre !

    Comment le géreriez-vous ?

    Merci d'avance pour votre réponse.

  2. #2
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Par défaut
    Bonjour,

    pour répondre sur une partie de ton projet, je dirais que ce n'est très certainement pas une bonne idée de partager le même EntityManager (em) dans toute ton application.
    Tu pourrais par contre, faire/créer un EntitManagerFactory (emf) unique et que tu utiliseras à chaque fois pour instancier un "em" à chaque fois que tu en auras besoin !

    Autrement dit,
    - tu fais un singleton qui retourne le même EntityManagerFactory (emf)
    - tu fais une fabrique qui te retourne une EntityManager (em) à partir de l'emf.

    Mais ne pas faire un singleton pour "em"

    Cordialement
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  3. #3
    Membre chevronné
    Avatar de bricecol
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 364
    Par défaut
    C'est bien ce que je pensais. Effectivement, j'ai une Factory pour l'EntityManager.

    J'ai fais un test sur le partage des instances (entre clients), et j'ai des concurrents exceptions
    quand j'ai le même EM. Je pourrais mettre des synchronized sur les utilisations de l'EM,
    mais ce serait certainement plus lent que d'en créer quand j'en ai besoin !

    Et que penses-tu de créer un EM par client en gardant celui-ci en session ?

    Merci encore !

  4. #4
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Par défaut
    Bah, ça dépend de comment est architecturé ton projet et si entre autre un client (pendant une session) peut exécuter ou non un job en parallèle avec le même entitymanager.
    Autrement dit, est ce que ton client risque de faire 2 jobs en parallèle avec le même 'em'
    Si le client ne fait pas des jobs multithreadés avec le même "em", pourquoi pas.
    Sinon, si le client lances des threads, alors je dirais que c'est pas une très bonne idée.
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  5. #5
    Membre chevronné
    Avatar de bricecol
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 364
    Par défaut
    Ah mince, ZK est multithreadé puisqu'il lance (pour un même client) des requêtes AJAX.
    Ces requêtes feront donc appel au même EM.

    En clair, il faut soit désactiver le multithreadé sur ZK, soit créer un EM à chaque fois
    qu'on effectue une opération sur la BDD et le fermer ensuite...
    Ça fait du code en plus tout çà. Je pourrais faire un contrôleur abstrait qui ouvre une connexion,
    appel la méthode de l'implémentation puis ferme la connexion...

    Ou alors je met des synchronized sur l'EM qui est en session (et donc unique par client)...

  6. #6
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Par défaut
    (1) Je ne te conseille pas de faire des "synchronized" sur tes "em", ça alourdit ton code, rend difficile la maintenance etc etc ...
    (2) Crées une nouvelle "em" pour chaque traitement puis ferme la. (je pense que c'est plus simple et efficace)
    (3) JPA a une API qui te permet de gérer les traitements concurrentiels ... (raison de plus pour ne pas utiliser 'synchronized')
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 16/06/2006, 13h46
  2. swing best practices.
    Par bbclone dans le forum AWT/Swing
    Réponses: 13
    Dernier message: 07/06/2006, 10h14
  3. Réponses: 4
    Dernier message: 23/05/2006, 14h22

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