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 :

[C3PO][Struts2] Limiter le nombre de connexions à la base ?


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Profil pro
    gnome
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : El Salvador

    Informations professionnelles :
    Activité : gnome

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 71
    Points
    71
    Par défaut [C3PO][Struts2] Limiter le nombre de connexions à la base ?
    Bonjour,

    Je développe une application web autour de PostgreSQL(8), Tomcat (5.5 ou 6), Stuts2 et Hibernate (3.2).

    Je stocke les images en base, sous forme de blobs, que je récupère via Hibernate.

    Pour CHAQUE image de la page web, j'ai un tag Struts2 qui appelle une Action Struts 2 (une servlet) qui retourne un flux binaire contenant l'image. La requête d'image est émise depuis le navigateur du client. Assez classique.

    Le fait est que si la page contient 50 images, la servlet sera appelée 50 fois, en parallèle, et demandera 50 connexions simultannées au pool de connexions C3PO (le pool fourni par défaut avec Hibernate 3).

    Celà multiplié par le nombre d'utilisateurs du site, ça peut vite grimper très haut, trop haut.

    Par exemple, par défaut sur ma distrib Ubuntu, Postgres accepte 100 connexions. Et ça finit par coincer même en étant le seul utilisateur. J'ai augmenter le nombre de connexions, mais ça n'est porbablement pas une solution satisfaisante pour un site web de production.

    Il y a sûrement une erreur majeure de débutant. Mes questions sont donc les suivantes :

    - Quelle solution adopter, en gardant le principe des images en base et de l'utilisation d'Hibernate ?
    - Y a-t-il un moyen pour ordonancer les requêtes d'images (les faire arriver en série, pas en parallèle) ?
    - Ou bien est-il possible de faire patienter une requête lorsqu'il n'y a plus de connexion disponible, au lieu de retourner une exception ?
    - Pour un serveur de prod, jusqu'à combien de connexions maxi est-il raisonnable de pousser un serveur PostgreSQL (sur un serveur virtuel, donc assez modeste) ?

    Merci pour votre aide sur ce problème. J'imagine que je ne dois pas être le premier à le rencontrer tellement la situation doit être fréquente !

    Cordialement,
    Bob

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Tout d'abord il faut savoir que pour obtenir de bonne performance et vouloir stocker les images en SGBD, il faut nécessairement que les images soient de petites tailles. Sinon cela jouera sur les performances de ton serveur SGBD.

    En ce qui concerne ton chargement d'image, je te conseille fortement d'éviter d'implémenter les requêtes sur le client car comme tu as pu le constater le chargement de 50 images représentent 50 chargement de l'action et 50 appels vers la SGBD! Tout ça pour l'affichage d'une seule page d'un client... C'est un coup trop important.

    Je te conseille de revoir un peu les tuto de struts 2 car il est possible de chargé toutes images d'un coup.

    Voici un leger aperçu de ce que tu dois faire pour améliorer les performances :

    Dans ta classe action qui précède la redirection vers ta jsp(qui affiche tes 50 images) tu définis un attribut du type list ou ArrayList ou bien même un tableau(mais contraignant car nécessite une réalocation d'un espace mémoire si la quantité d'image varie).

    Ensuite dans la méthode de cette action que tu appelles pour faire la redirection (en principe "public String execute(){...}" ) tu exécutes la requête pour récupérer toutes les images nécessaire dans ta SGBD puis tu initialises ton attribut "liste" avec l'ensemble des images que tu souhaites charger.

    Voici un petit lien qui te montre un exemple :
    http://www.planetstruts.org/struts2-...listPeople.ftl

    Ensuite il ne te reste plus qu'a écrire les tags dans ta jsp pour afficher le contenu de ta liste.

    Il est dommage de ne pas respecter le modèle MVC car struts 2 simplifie énormément le développement. Cela permet également de faire face au modification de code très simplement.
    Je te conseille donc d'utiliser SPRING(recommandé par struts 2) ou EJB3(qui marche aussi très bien).

    J'espère avoir pu t'apporter un peu d'aide.

    Bon courage!


  3. #3
    Membre régulier
    Profil pro
    gnome
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : El Salvador

    Informations professionnelles :
    Activité : gnome

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 71
    Points
    71
    Par défaut
    Salut, et merci pour cette réponse très circonstanciée.

    Je vois parfaitement ce que tu veux dire et ça me semble très logique.

    Simplement, ce que je ne sais pas faire, c'est comment faire afficher, avec la JSP, les images contenues dans l'ArrayList.

    Je vais faire un <iterator>, par exemple, mais que mettre dans cet iterator ?

    Pour afficher des propriétés de texte, il suffit de faire : <s:property value="lastname"/>

    Mais pour une image, <img src...>, et ensuite ?? Selon mes connaissances "src ne peut prendre qu'une URL, donc un appel au serveur...


    Merci pour ton aide.

    Cordialement,

    bob

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    je développe actuellement une application avec Struts2, hibernate, postgeSQL et jboss (ou jetty).

    J'aimerais également inclure la possibilité aux utilisateurs d'uploader/télécharger des fichiers.

    Pour l'instant j'arrive à uploader les fichiers et les écrire sur le disque dur. Pour les renvoyer aux utilisateurs il n'y a pas de problème.

    Par contre j'aimerais ne plus écrire les fichiers sur le disque, mais les enregistrer dans la base de données, et là je coince... peux-tu me dire comment tu fais ?

    Merci d'avance.

  5. #5
    Membre régulier
    Profil pro
    gnome
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : El Salvador

    Informations professionnelles :
    Activité : gnome

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 71
    Points
    71
    Par défaut
    Salut,

    J'utilise Hibernate pour gérer les échanges avec la base (mais tu peux aussi le faire sans, les exemples sont nombreux sur ce site) :

    - Mettre le fichier dans un Blob. Ici avec Hibernate :
    private Blob bBlob = Hibernate.createBlob(FileUtils.openInputStream(myDoc));

    - Créer l'objet à insérer en base (de Type Asset chez moi), avec ce blob :
    Asset asset1 = new Asset(at, new Date((new GregorianCalendar()).getTimeInMillis()), getDefaultName(), getDefaultDescription(), myDocFileName, bBlob);

    - Enregistrer : em.persist(asset1);

    Pour ensuite lire les images avec de bonnes performances, je récupère ensuite toutes les images d'une page web, d'un bloc, et je les mets dans un répertoire temporaire du système de fichiers. La servlet qui requête ensuite les images (dans la balise img), va les chercher dans ce répertoire.

    Autrement, les performances étaient catastrophiques.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup pour ta réponse.

    Entre temps j'ai réussi à enregistrer les fichiers dans la base. J'utilise la technique que tu décris avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    Document doc = new Document();
    Blob blob = Hibernate.createBlob(inputStream); 
    doc.setBlob(blob);
    em.persist(doc);
    ...
    Par contre mon problème est de récupérer les données. Je n'arrive à récupérer que quelques Ko de données alors que les fichiers font environ 1Mo. Pour récupérer les blob j'utilise le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    Document doc = em.find(Document.class, idDoc);
    InputStream in = doc.getBlob().getBinaryStream();
    ...
    Je ne vois pas où se situe le problème, comment fais-tu pour récupérer les blob ?

Discussions similaires

  1. [ASE]Comment limiter le nombre de connexion
    Par log2n dans le forum Adaptive Server Enterprise
    Réponses: 1
    Dernier message: 22/09/2007, 11h57
  2. [DB2] Limiter le nombre de connexion persistantes
    Par silver.spike dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/06/2007, 09h28
  3. mysql_pconnect() - limiter le nombre de connexions
    Par Lideln dans le forum Débuter
    Réponses: 10
    Dernier message: 08/11/2006, 13h34
  4. Limiter de nombre de connexions simultanées
    Par Drahu dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 08/09/2005, 11h43
  5. limiter le nombre de connexion VB-Oracle
    Par lonestar dans le forum Oracle
    Réponses: 12
    Dernier message: 05/08/2005, 12h29

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