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

Hibernate Java Discussion :

RMI et lazyloading dans une application 3 tiers


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 18
    Points : 14
    Points
    14
    Par défaut RMI et lazyloading dans une application 3 tiers
    Bonjour,

    Je réalise dans le cadre de mes études un projet J2EE, notre premier projet J2EE, qui mets en oeuvre les choses suivantes:
    un client léger (struts tomcat)[machine 1], un service web[machine 1] et un client lourd(swing)[machine 2] qui tous trois font appel via RMI à des POJO[machine 3](respectant les conventions javabean) persistés avec hibernate 3.2.5 dans une base mysql[machine 4].

    Cette architecture a été choisie avec le peu de recul que nous avions , mais bref.

    Nous avons organisé cela de la manière suivante (là encore avec notre recul limité):
    Un projet Metier contenant:
    • Un package domaine avec les pojos (A B C)
    • Un package service (ServiceA, ServiceB, ServiceC et leurs interfaces) pour proposer quelques méthodes métier sur les classes du domaines
    • Un package dao (DaoA DaoB DaoC et leurs interfaces) qui est utilisé uniquement par les Services. Dans DAO, chacune de nos méthodes ouvre et ferme la session, donc rien n'est fait en dehors du DAO à propos des sessions.
    • Un package rmi avec un unique serveur RMI (est-ce une bonne chose ?) qui fait appel quasiment directement à chacune des méthodes des différents Services et qui est le seul point d'accès des vues à la couche métier.
    • Un package junit avec nos tests unitaires.

    Des projets appliLourde, appliWeb, et webService.

    J'ai lu le thread http://www.developpez.net/forums/sho...d.php?t=343249, mais d'une part, j'ai manqué de détail pour être capable d'appliquer les idées qui s'y trouvent, et d'autre part, je ne sais pas si cela s'applique toujours quand RMI viens s'en mêler.

    Le problème classique
    On pensait se débrouiller pas mal, ayant réussi à faire une appli lourde permettant d'ajouter/supprimer/lister des objets simples (sans relations à d'autres objets) en base, cela s'est compliqué pour faire la même chose avec un objet ayant une référence vers un autre objet qui mène à l'erreur "LazyInitializationException" (en réalité, c'est dans l'affichage de la liste de ces objets, que la méthode toString fait appel aux références et que celles-ci n'ont vraisemblablement pas été chargées bien qu'aucun lazy=true ne figure dans nos fichiers de mapping).

    Après m'être une peu renseigné, j'ai abouti aux conclusions suivantes
    • Il n'est pas possible de maintenir la session jusqu'à ce que la vue soit finie de charger

      What about three-tier environments?

      It's clear that this pattern only makes sense if you can actually use a local Session when rendering the view. In a three-tier environment the view might be rendered on the presentation virtual machine, not on the service virtual machine with the business and data access layer. Therefore, keeping the Session and transaction open is not an option. In this case you have to send the right "amount" of data to the presentation layer, so a view can be constructed with the Session already closed. It depends on your architecture if you better use Detached Objects, Data Transfer Objects, or maybe a mix of both with the Command Pattern. These options are discussed in Hibernate in Action.

      source: http://hibernate.org/43.html
    • L'idéal pour moi était pourtant de pouvoir garder le lazy-loading à distance afin de ne pas avoir à prévoir ce dont le client a besoin, mais apparemment les POJOS ne seraient pas fais pour ça (cf. http://www.developpez.net/forums/sho...=rmi+hibernate)
    • Il faut donc charger toutes les infos dont l'interface a besoin. Mes objets domaine étant très liés entre eux, j'aurai je pense vite fait de charger tout le graphe objet si je n'y fait pas attention (même si c'est un projet d'étude, donc les données ne sont pas très volumineuses).

    Si mes conclusions sont correctes, ma question est donc: Y a-t-il un moyen élégant de charger uniquement les objets nécessaires à la vue, sachant que certaines méthodes (listAll par exemple) peuvent être appelées à des fins différentes et donc ne pas nécessiter les mêmes informations.

    J'ai du mal à me résoudre à créer une méthode pour chaque usage ou bien à passer des options en paramètres..
    J'aurai donc besoin d'un petit coup de pouce à ce niveau là .

    Merci beaucoup pour votre aide.

  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
    Depuis Hibernate 3, lazy = true est le comportement par défaut.

    Pour ton problème, tu peux faire plusieurs versions d'une même méthode qui charge les collections dont la vue a besoin. (comme tu l'as suggéré)
    Au moins, tu n'as pas de session à manipuler côté vue.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Merci pour ta réponse.

    Pour la solution que tu me proposes, par "tu peux faire", tu veux dire que c'est la solution la plus simple pour un projet d'études ?
    Car en fait le but est, même si un raccourci serait facile à prendre, de chercher les solutions qui serait toujours applicables si le projet était plus ambitieux.
    Quelle serait la solution la plus propre, quelle serait la solution la plus rapide, quelle solution est en général adoptée par les entreprises ?

  4. #4
    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
    Regarde cette discussion, ça évoque ta problématique : http://www.developpez.net/forums/sho...d.php?t=474872

    Disons, que la méthode que je te propose est simple à comprendre et à mettre en oeuvre.
    Elle est applicable aussi bien aux applications web qu'aux applications desktop.
    Le problème qu'on peut y voir, c'est de mutliplier les méthodes qui renvoient le même objet, avec des collections chargées différentes.
    A part ça, je ne vois pas grand chose de négatif.
    Biensur, il faut faire attention de ne pas renvoyer tout un graphe d'objets à la vue pour ne pas plomber les performances et éviter les out of memory.

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/07/2004, 22h30
  2. Réponses: 8
    Dernier message: 17/03/2004, 14h40
  3. Licence MySql en tant que BD dans une application web
    Par Volta dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 26/02/2004, 14h38
  4. fenetre dos dans une application
    Par jfb53 dans le forum C++Builder
    Réponses: 3
    Dernier message: 19/10/2003, 18h06

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