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

JDBC Java Discussion :

Un seul objet 'Connection' pour toutes les requêtes et pages d'une session ?


Sujet :

JDBC Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut Un seul objet 'Connection' pour toutes les requêtes et pages d'une session ?
    Deux questions, s v p

    Contexte : Une application de site web en développement, qui devra 'tourner' sur un serveur d'application + un serveur de servlets Tomcat + un serveur MySQL.

    Je ne me trompe en aucun des points suivants ?
    ° Un objet 'Connection' sert à l'établissement d'une session entre un client et le serveur. Il peut servir à plusieurs requêtes consécutives (c à d pas simultanées) vers/de la base de données.
    ° Accès direct :
    °° Un objet 'Connection' est créé à partir d'un objet 'DriverManager',
    °° Seulement pour petit nombre de connexions simultanées
    °° Ne s'établit pas anticipativement, ni ne se clôture en fin d'exécution de programme.
    ° Pool de connexions
    °° Un objet 'Connection' est créé à partir d'un objet 'DataSource'
    °° Cet objet sert à ouvrir anticipativement un nombre prédéterminé de connexions vers la base de données. Les transactions se passent plus tard, au gré de l'application. Cet objet n'est fermé qu'en fin d'exécution de programme.
    ° Accès direct et Pool de connexions
    °° A chaque création d'un objet 'Connection' (des deux types), il y a une petite perte de temps due à l'établissement ou à l'abandon de la connexion.

    1) Connexion directe (obtenue d'un objet DriverManager) ou Pool de connexions (objet DataSource) ?
    Supposition : (Plus de) deux clients font appel simultanément à l'application qui doit aller chercher des données en base SQL.
    Plusieurs connexions peuvent être établies simultanément ...
    - (Quest.#1) à l'aide de plusieurs 'connexions directes', à condition de ne pas dépasser un certain nombre de sessions simultanées (seuil déterminé par quoi ?)
    - à l'aide d'un 'pool de connexions'

    2) En considérant qu'il n'y a qu'un seul client qui appelle l'application sur le serveur, au travers d'une session,
    en supposant que différentes pages de l'application nécessitent différents groupes de données (ResultSets) de la base SQL,
    en sachant que chaque page a ses propres (prepared)Statement, value Bean et classe DataAccess,
    (Quest.#2) faut-il instancier un objet 'Connection' (issu d'un objet 'DataSource') pour ...
    a) un seul pour ladite session, par lequel transiteront toutes les requêtes ...
    - des différentes pages (différents objets DataAccess)
    - consécutives de mêmes pages (même objet DataAccess)
    (je pense que cette option-ci est la bonne, vous confirmez ?)
    b) chaque page, soit pour chaque objet DataAccess
    c) un pour chaque requête consécutive, même si d'un même objet DataAccess (brrrrrr....)

    Merci d'avance.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 43
    Points : 49
    Points
    49
    Par défaut Embrouillé....
    Elo,

    J'ai essayé de lire attentivement tes questions, si elle sont toujours d'actualité il faudrait les reformuler parce que tu m'as perdu...
    J'ai l'impression que les notions de Datasource et de pool de connexion te posent souci. Tu trouveras bien sûr des explications très complètes dans les différents cours proposés sur le site, mais je suis prêt à t'aider si encore une fois tu reformule un peu tes questions.

    Pour l'instant, il faut déjà que tu comprennes que la Datasource représente pour toi ton point d'accès au pool de connexion en JDBC 2.0.
    Certes, Pool de connexion et Datasource sont un peu mélangés dans la configuration de Tomcat ce qui n'est pas le cas dans d'autres serveurs applicatifs.
    Pour une application Web, il n'y a normalement aucun intérêt à passer par le DriverManager. En effet, l'avantage de la Datasource est qu'elle est instanciée, configurée et mise à disposition par ton serveur Tomcat. En cas de changement de base, ton code ne changera pas, contrairement au cas du DriverManager.

    Derrière la Datasource il y a ton pool de connexion qui va te fournir des connexions OUVERTES lorsque tu le désires. Tu peux utiliser des pools de connexion sans JDBC 2.0 et les Datasource, mais encore une fois aucun intérêt dans une application web standard.

    Bon j'espère que je ne t'ai pas encore plus perdu...
    A+

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut
    Merci Jean David Kevin pour ta réponse qui m'éclaire.
    Le point 2) est le principal.
    Dit autrement :
    A partir de quand multiplie-t-on trop les nouvelles connexions, du point de vue d'un programmeur expérimenté ?
    A partir d'une nouvelle connexion pour chaque nouvelle requête, même d'une même page, d'une même session ?
    A partir d'une nouvelle connexion pour chaque page JSP d'un site ?
    A partir d'une nouvelle connexion pour chaque session ?

    Quand une même connexion est-elle réutilisable car il n'y a pas de risque de collision de queries vers la BD ?

    Merci d'avance

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 43
    Points : 49
    Points
    49
    Par défaut Ok je vais préciser.
    Tu ne multipliera pas les connexions si tu travaille avec un pool de connexion et que tu ne conserve pas ces connexions en mémoire.
    Autrement dit, dès lors que tu t'assure de faire un close() sur la connexion que tu as récupérée, après l'avoir utilisée, c'est connexion est libérée et utilisable plus tard.
    Dans ton cas, il ne faut donc JAMAIS mettre une connexion en session ! Il faut récupère une connexion du pool à chaque fois !
    Rappelle toi bien que un getConnection d'un pool ne créé pas une nouvelle connexion (sauf si tu dépasse la taille initiale du pool mais c'est marginal), celà ne fait que récupérer une connexion libre, et qu'un close() ne ferme pas la connexion, cela ne fait que la libérer !

    Comme ca je n'ai pas d'url à te proposer mais comme j'enseigne JEE à l'université je peux toujours t'envoyer mon cours si tu le souhaites.

    Bon courage.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 43
    Points : 49
    Points
    49
    Par défaut Suite
    J'avais oublié des questions...ah et juste au passage en fait JeanDavidKevin c'est juste un pseudo

    Par rapport aux "collisions", assure toi simplement si tu effectue plusieurs requetes avec la même connexion, fermer proprement les resultset si tu les réutilises :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Resultset rs=stmt.executeQuery........
    .....
    rs.close();
    rs=stmt.executeQuery.......
    etc...
    Bon globalement si tu créé des Resultset à chaque nouvelle requête pas de problème.

    Concernant la JSP, il n'est de toute façon plus conseillé dans les applications modernes de faire des requêtes dans la JSP. Fait les requêtes dans un servlet, un Managed Bean une action Struts ce que tu veux, mais conserve les JSP pour l'affichage de ta page uniquement.

    Ciao

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Points : 121
    Points
    121
    Par défaut Un seul objet 'Connection' pour toutes les requêtes et pages d'une session ?
    Merci JeanDavidKevin. C'est bien le point qui était nébuleux auquel tu as répondu.

    Oui, dans chacune de mes classe Data Access, propres à chaque page JSP, j'exécutais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            finally
            {
                try
                {
                    if (resultSet_QuantVehic !=null) resultSet_QuantVehic.close();
                    if (statem_QuantVehic    !=null) statem_QuantVehic.close();
                    if (connect2MC           !=null) connect2MC.close();
                }
                catch (Exception ex)
    A chaque 'getConnection()', je récupère donc une connexion (précédemment fermée) du pool.

    Merci

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 43
    Points : 49
    Points
    49
    Par défaut Oui
    Tout à fait, si tu passes par un pool bien évidemment...
    Si dans ton code tu fais appel explicitement au DriverManager c'est plus la même chose.
    Bon courage

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

Discussions similaires

  1. [XL-2010] Un seul code VB pour toutes les feuilles
    Par juan67 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 11/02/2013, 16h45
  2. Réponses: 3
    Dernier message: 13/01/2012, 16h38
  3. [AC-2003] Modifier une propriété pour toutes les requêtes de la Bd
    Par chordially dans le forum VBA Access
    Réponses: 4
    Dernier message: 09/07/2010, 21h54
  4. Réponses: 0
    Dernier message: 30/12/2009, 02h52
  5. Ma requête ne calcul pas pour tout les champs
    Par leloup84 dans le forum Requêtes
    Réponses: 10
    Dernier message: 01/03/2006, 12h59

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