Date sent: Wed, 20 Jun 2001 17:30:50 +0200
From: Sebastien Cesbron <scesbron@ifrance.com>
To: java@u-strasbg.fr
Subject: ConnectionPool
Send reply to: java@u-strasbg.fr
Bonjour,
Si on se connecte à une base de données en créant sa propre connexion, on
est sûr que celle-ci est dans un état correct. Lorsque l'on utilise un
pool de connexion, une même connexion est tour à tour partagée par
plusieurs utilisateurs. Un utilisateur peut laisser la connexion dans un
état instable ou tout simplement différent de l'état de départ.
Personnellement je pense aux problèmes des transactions. Si on prend
l'exemple de code suivant :
Connection conn = pool.getConnection();
conn.setAutoCommit(false);
Statement stmt = pool.createStatement();
stmt.executeUpdate("insert into ...");
stmt.close();
stmt = pool.createStatement();
stmt.executeUpdate("insert into ...");
stmt.close();
conn.commit();
pool.releaseConnection(conn);
Quelles sont les requêtes qui sont validées par le commit ?
Personnellement j'ai l'impression que les deux requêtes sont validées par
le commit. Or, si la première a été faite par un utilisateur A et la
seconde par un utilisateur B, ce second utilisateur peut croire qu'il ne
valide que sa propre requête. D'où ma question :
Existe t'il un moyen de garantir au niveau du pool qu'aucune transaction
n'est en cours pour la connexion que l'on transmet à un utilisateur ?
J'avais pensé faire un rollback pour annuler toute transaction
éventuellement en cours mais cela fait planter ma base.
Mais au fait : est ce réellement au pool de s'occuper de cela ? J'ai
regardé le code de plusieurs pools et je n'ai jamais trouvé quoi que ce
soit à ce propos. Cela me parait bizarre car le but est de faire en sorte
que les connexions normales et les connexions poolées soient les plus
proches possibles.
__________________________________________________________________________
____ ifrance.com, l'email gratuit le plus complet de l'Internet ! vos
emails depuis un navigateur, en POP3, sur Minitel, sur le WAP...
http://www.ifrance.com/_reloc/email.emailif
From: Laurent Forêt <l.foret@korom.net>
To: <java@u-strasbg.fr>
Subject: RE: ConnectionPool
Date sent: Thu, 21 Jun 2001 09:52:33 +0200
Send reply to: java@u-strasbg.fr
> -----Message d'origine-----
> De : cesbron@ifrance.com [mailto:cesbron@ifrance.com]De la part de
> Sebastien Cesbron
> Envoyé : mercredi 20 juin 2001 17:31
> À : java@u-strasbg.fr
> Objet : ConnectionPool
>
>
> Bonjour,
>
> Si on se connecte à une base de données en créant sa propre connexion,
> on est sûr que celle-ci est dans un état correct. Lorsque l'on utilise
> un pool de connexion, une même connexion est tour à tour partagée par
> plusieurs utilisateurs. Un utilisateur peut laisser la connexion dans un
> état instable ou tout simplement différent de l'état de départ.
> Personnellement je pense aux problèmes des transactions. Si on prend
> l'exemple de code suivant :
>
> Connection conn = pool.getConnection();
> conn.setAutoCommit(false);
> Statement stmt = pool.createStatement();
>
> stmt.executeUpdate("insert into ...");
> stmt.close();
>
> stmt = pool.createStatement();
> stmt.executeUpdate("insert into ...");
> stmt.close();
>
> conn.commit();
>
> pool.releaseConnection(conn);
>
> Quelles sont les requêtes qui sont validées par le commit ?
Normalement toutes celles qui ont été effectuées sur la connexion avant le
commit. Donc, les deux.
> Personnellement j'ai l'impression que les deux requêtes sont validées
> par le commit. Or, si la première a été faite par un utilisateur A et la
> seconde par un utilisateur B, ce second utilisateur peut croire qu'il ne
> valide que sa propre requête. D'où ma question :
>
>
> Existe t'il un moyen de garantir au niveau du pool qu'aucune transaction
> n'est en cours pour la connexion que l'on transmet à un utilisateur ?
> J'avais pensé faire un rollback pour annuler toute transaction
> éventuellement en cours mais cela fait planter ma base.
>
Je me suis penché un peu sur la javaDoc de javax.sql et il est définit que
des interfaces (comme javax.sql.PooledConnection) et pas d'implémentation.
Donc le pool dont vous parlé est "maison".
Néanmoins, Je ne pense pas qu'il soit possible de faire des commits et des
rollback sur une connection particulière avec un client, puisque le
principe du pool est de partager ces dites connections entre les clients.
A la rigueur on pourait partager des connections dont chaque client aurait
des Statement sur lesquels on pourrait faire des commits et des rollbacks.
Mais ce n'est pas le cas.
> Mais au fait : est ce réellement au pool de s'occuper de cela ? J'ai
> regardé le code de plusieurs pools et je n'ai jamais trouvé quoi que ce
> soit à ce propos. Cela me parait bizarre car le but est de faire en
> sorte que les connexions normales et les connexions poolées soient les
> plus proches possibles.
>
Je pense que si on veut du transactionnel, il faut oublier les pools. Des
avis contraire ?
-------------------------------------
Laurent Forêt
Service développement
l.foret@korom.net
www.korom.net