OVH Cloud OVH Cloud

webapp et connexions jdbc : combien ? quand ?

6 réponses
Avatar
Joe
bonjour ou bonsoir,
je me pose quelques questions quant à la distribution des instances
de Connection au sein d'une webapp constituée de servlets, pages jsp...

jusqu'ici, j'en étais resté à la solution d'un singleton encapsulant
une unique connexion pour toute mon appli, mais cela me pose quelques
problèmes quant au renouvellement de ladite connexion (au bout d'un
moment, le lien avec mon sgbd se perd)

j'ai envisagé d'utiliser un pool de connexion, mais ca m'a amené a me
poser la question du nombre de connexions ; vaut il mieux :
- une seule connexion pour toute l'appli
- une connexion par session (ca me parait pas tres raisonnable)
- une connexion 'versatile', ouverte et fermée à chaque utilisation ;
outre le fait que ca implique l'utilisation d'un pool pour limiter les
temps de connexion, cela peut amener a utiliser énormément de
connexions pour certains traitements (par ex, une itération sur un
resultset qui appelle la création d'une instance d'une classe qui utilise
elle meme une connexion, etc...)
- d'autres solutions ?

merci d'avance pour vos retours et conseils
joe

6 réponses

Avatar
Emmanuel Bourg
En général la taille maximale du pool correspond au nombre de requê tes
simultanées que ton application doit servir. Par exemple si tu estimes
que tu auras à tout moment 200 utilisateurs (ou sessions) qui chargent
une nouvelle page toutes les 10 secondes avec un temps de traitement de
l'ordre d'une seconde, il te faudra un pool de 20 connexions.

Tu peux aussi procéder par essais successifs, en prenant une taille de
pool modeste et en augmentant le plafond à chaque fois que la limite es t
atteinte. Tu finiras par converger vers la bonne valeur pour ton
application.

Emmanuel


Joe wrote:
bonjour ou bonsoir,
je me pose quelques questions quant à la distribution des instances
de Connection au sein d'une webapp constituée de servlets, pages jsp. ..

jusqu'ici, j'en étais resté à la solution d'un singleton encapsul ant
une unique connexion pour toute mon appli, mais cela me pose quelques
problèmes quant au renouvellement de ladite connexion (au bout d'un
moment, le lien avec mon sgbd se perd)

j'ai envisagé d'utiliser un pool de connexion, mais ca m'a amené a me
poser la question du nombre de connexions ; vaut il mieux :
- une seule connexion pour toute l'appli
- une connexion par session (ca me parait pas tres raisonnable)
- une connexion 'versatile', ouverte et fermée à chaque utilisation ;
outre le fait que ca implique l'utilisation d'un pool pour limiter les
temps de connexion, cela peut amener a utiliser énormément de
connexions pour certains traitements (par ex, une itération sur un
resultset qui appelle la création d'une instance d'une classe qui uti lise
elle meme une connexion, etc...)
- d'autres solutions ?

merci d'avance pour vos retours et conseils
joe



Avatar
Joe
On Mon, 20 Oct 2003 11:50:54 +0200, Emmanuel Bourg wrote:

En général la taille maximale du pool correspond au nombre de requêtes
simultanées que ton application doit servir. Par exemple si tu estimes
que tu auras à tout moment 200 utilisateurs (ou sessions) qui chargent
une nouvelle page toutes les 10 secondes avec un temps de traitement de
l'ordre d'une seconde, il te faudra un pool de 20 connexions.

celà signifie t'il donc que, pour toi, je dois définir une connexion par

"page" ? via un bean de type request ? ca rappelle la façon de faire de
php, mais est ce la méthode la plus appropriée dans le cadre d'une archi
J2EE ?

joe

Avatar
Emmanuel Bourg
Joe wrote:

celà signifie t'il donc que, pour toi, je dois définir une connexio n par
"page" ? via un bean de type request ? ca rappelle la façon de faire de
php, mais est ce la méthode la plus appropriée dans le cadre d'une archi
J2EE ?


Non pas du tout, une connexion du pool peut être utilisée pour n'impo rte
quelle page de l'application. Question annexe, tu utilises quoi pour ton
pool de connexions ? J'ai peur que tu essayes de mettre les connexions
en session, rassure moi :)

Emmanuel

Avatar
Joe
celà signifie t'il donc que, pour toi, je dois définir une
connexion parr


"page" ? via un bean de type request ? ca rappelle la façon de faire
de php, mais est ce la méthode la plus appropriée dans le cadre d'une
archi J2EE ?


Non pas du tout, une connexion du pool peut être utilisée pour
n'importe quelle page de l'application. Question annexe, tu utilises
quoi pour ton pool de connexions ? J'ai peur que tu essayes de mettre
les connexions en session, rassure moi :)

non non rassure toi, pas de connexion en session en vue :-) comme je te le

disais, jusqu'ici j'utilisais un singleton pour mon appli

si je pose ma question d'un point de vue plus général, ca pourrait etre
: qu'est ce qui incite a utiliser plusieurs connexions ? finalement,
hormis mon problème de timeout, mon appli fonctionnait bien avec une
seule connexion ; je vois bien qu'il doit y avoir des raisons tres
objectives qui font utiliser X connexions, mais je n'ai jamais réussi a
lire pourquoi : prob de performances, ou autre...?

joe


Avatar
Emmanuel Bourg
Joe wrote:

non non rassure toi, pas de connexion en session en vue :-) comme je te le
disais, jusqu'ici j'utilisais un singleton pour mon appli

si je pose ma question d'un point de vue plus général, ca pourrait etre
: qu'est ce qui incite a utiliser plusieurs connexions ? finalement,
hormis mon problème de timeout, mon appli fonctionnait bien avec une
seule connexion ; je vois bien qu'il doit y avoir des raisons tres
objectives qui font utiliser X connexions, mais je n'ai jamais réuss i a
lire pourquoi : prob de performances, ou autre...?

joe



C'est essentiellement une question de performances. Tu ne peux pas
exécuter deux requêtes en même temps sur la même connexion. Tant que tu
n'as qu'un seul accès à la base à tout moment ça ne pose pas de p roblème
comme tu as pu le constater. Si la charge augmentait tu commencerais à
observer des temps d'attente plus ou moins long selon la complexité des
traitements.

Ce goulot d'étranglement ne justifie pas l'utilisation d'un pool en soi ,
après tout on pourrait créer une nouvelle connexion à chaque accè s à la
base. Cependant la création d'une connexion prend beaucoup plus de temp s
que d'aller en chercher une dans le pool. Quand l'application commence à
être chargée l'impact sur les performances devient significatif.

Emmanuel

Avatar
Joe
Ce goulot d'étranglement ne justifie pas l'utilisation d'un pool en soi,
après tout on pourrait créer une nouvelle connexion à chaque accès à la
base. Cependant la création d'une connexion prend beaucoup plus de temps
que d'aller en chercher une dans le pool. Quand l'application commence à
être chargée l'impact sur les performances devient significatif.

ok, merci beaucoup pour tes éclaircissements !