Tomcat et pool de connexions - Java - Programmation
Marsh Posté le 27-07-2004 à 11:09:10
Voici ma classe pour me connecter :
Citation : /* |
Marsh Posté le 27-07-2004 à 11:10:28
Et un exemple d'utilisation :
Citation : public int insertBd() { |
Marsh Posté le 27-07-2004 à 11:20:38
Jamais utilisé le pool de connexions intégré à Tomcat.
Pers j'utilise Protomatter, et tout se passe très bien.
Marsh Posté le 28-07-2004 à 10:26:34
Protommater c bien, mais mon appli est quasi-fini et installé chez le client, mais j'ai toujours ce probleme de pool
Citation : org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted, cause: |
Je dois rajouter ceci ?
Citation : <parameter> |
Je ne ferme pas toute mes connexions ?
Marsh Posté le 28-07-2004 à 10:28:29
si c'est un pool tu n'es pas censé t'occuper de l'ouverture/fermeture hein. C'est justement le but du pool ...
Marsh Posté le 28-07-2004 à 10:32:57
Sur le site de Tomcat, ils conseillent de fermer :
la connexion, le statement et le resultSet.
Quand on ferme la connexion, on ferme automatiquement le resultSet et le Statement ????
ça peut venir de cela ?
Marsh Posté le 28-07-2004 à 10:34:00
mazda3 a écrit : Quand on ferme la connexion, on ferme automatiquement le resultSet et le Statement ???? |
bin non
Marsh Posté le 28-07-2004 à 10:44:54
Bon benh ça doit etre ça qui multiple les utilisations de pool ...
Tu penses comme moi Darklord ?
ça va me faire des grosses modifs ça ...
Marsh Posté le 28-07-2004 à 10:49:58
DarkLord a écrit : si c'est un pool tu n'es pas censé t'occuper de l'ouverture/fermeture hein. C'est justement le but du pool ... |
Pardon, je me suis mal exprimé.
Quand je fais un conn.close();
La connexion utilisée pour "cette requete" va être libéré ? ou il faut aussi que je ferme aussi le Statement et le ResultSet ?
Marsh Posté le 28-07-2004 à 12:01:02
Tu dois toujours fermer ton statement et ton resulset, que tu utilises un pool ou pas.
Tu as l'URL où il suggèrent de fermer la connection avec un pool? Ca me parait bizarre (a moins qu'il wrappe l'implémentation avec un truc qui fait autre chose quand tu appelles close)
Marsh Posté le 28-07-2004 à 12:06:55
DarkLord a écrit : bin non |
Ben si, en partie.
Enfin, non, mais quand on ferme le Statement, on ferme les ResultSet qui en sont issus.
Cela dit, je parlais de protomatter : et bien pour ce driver, ils conseillent de bien tout fermer, ResultSet compris. Implémentation incorrecte !?
Marsh Posté le 28-07-2004 à 12:08:18
DarkLord a écrit : Tu dois toujours fermer ton statement et ton resulset, que tu utilises un pool ou pas. |
Ha !?
Extrait de doc de ResultSet :
|
Marsh Posté le 28-07-2004 à 12:13:13
El_gringo a écrit : Ha !?
|
oui et?
Qu'est ce que tu veux prouver au juste.
J'ai un PreparedStatement que je veux réutiliser pour faire plusierus query. Ca me génère à chaque fois un resultset différent. Quand j'ai choppé mes données je fermes mon resultset et je continue.
Si maintenant tu préfères que ce genre d'objet soit cleané via un timeout ou bien en réutilisant le meme objet, fine, c'est ton problème.
Mais je trouve plus propre de montrer explicitement dans le code que tu fermes les ressources que tu utilises.
Marsh Posté le 28-07-2004 à 13:34:47
C'est juste pour dire ce c'est pas une obligation de fermer ses ResultSet.
Cela dit, j'suis d'accord avec toi que c'est plus clean.
Marsh Posté le 28-07-2004 à 13:50:16
A cette adresse, tout en bas :
http://jakarta.apache.org/tomcat/t [...] howto.html
Je le mets en commentaires :
Citation : Random Connection Closed Exceptions |
Marsh Posté le 28-07-2004 à 13:52:06
Si j'ai bien compris, mon pb peut venir a cause de ça ? (que je n'ai pas tout fermer )
Marsh Posté le 28-07-2004 à 13:54:48
J'adore ...
Le gars il poste parce qu'il a un doute concernant son code et c'est lui qui 20 posts après poste un exemple concret.
Mazda3 > si tu as un stress avec ton code ca t'es pas venu à l'esprit d'utiliser celui que tu viens de poster? Vu que c'est un exemple de tomcat ....
Marsh Posté le 28-07-2004 à 14:03:51
DarkLord a écrit : J'adore ... |
Bah justement comme je viens de dire, mon appli est quasi-fini, sauf avec ce pb de pool (pas assez de pool ouvert , 100 c largement suffisant).
Et je suis pas sûr à 100% (mais à 60%, oui) qu'avec le code fourni en exemple sur le site de Tomcat, que celui-ci resoudra mon pb. Si je fais les modifs, j'en ai au moins pour une journée. Pas envie de perdre une journée pour rien.
j'ai implementer trop vite, j'aurais du tout lire
Marsh Posté le 28-07-2004 à 14:36:14
ben t'as qu'à mettre 2 connexions dans ton pool et regarder ce qui se passe avec un petit test...
Marsh Posté le 28-07-2004 à 18:07:57
_guigui_ a écrit : ben t'as qu'à mettre 2 connexions dans ton pool et regarder ce qui se passe avec un petit test... |
ça a l'air de fonctionner mais quand je mets le parametre du pool "maxActive" à zero, cela fonctionne egalement. ..
Je comprends plus rien ....
Citation : <Context className="org.apache.catalina.core.StandardContext" cachingAllowed="true" charsetMapperClass="org.apache.catalina.util.CharsetMapper" cookies="true" crossContext="false" debug="0" docBase="/usr/local/tomcat/webapps/elearning" mapperClass="org.apache.catalina.core.StandardContextMapper" path="/elearning" privileged="false" reloadable="true" swallowOutput="false" useNaming="true" wrapperClass="org.apache.catalina.core.StandardWrapper"> |
Marsh Posté le 28-07-2004 à 18:15:12
ReplyMarsh Posté le 28-07-2004 à 22:01:04
uriel a écrit : et l'exemple de tomcat te plait pas ? |
Si cela marche parfaitement, mais logiquement en mettant MaxActive à 0, je ne devrais avoir aucune connexion ...
Marsh Posté le 29-07-2004 à 11:17:52
Re-bonjour.
Personne ne sait comment "visualiser" les pools de connexion de Tomcat (ouverts, utilisés, etc ...) ?
Marsh Posté le 29-07-2004 à 11:18:44
demande à postgres
la DB est sous quel OS?
Marsh Posté le 29-07-2004 à 11:30:26
ReplyMarsh Posté le 29-07-2004 à 13:49:45
mazda3 a écrit : Si cela marche parfaitement, mais logiquement en mettant MaxActive à 0, je ne devrais avoir aucune connexion ... |
Non non t'as mal lu la doc. Ça veut dire aucune limite
Marsh Posté le 29-07-2004 à 13:54:59
J'avais lu que c'était -1 aucune limite ....
Après relecture : c'est bien 0 pour MaxActive en illimité et -1 pour le parametre MaxWait en illimité.
Merci
Marsh Posté le 29-07-2004 à 14:54:21
Après un test rapide sur un TOMCAT 4.1.27 si maxActive est à 0 ou -1 cela ne fonctionne pas. On a une exception : DBCP could not obtain an idle db connection. En repassant maxActive à 1 c'est OK.
Marsh Posté le 29-07-2004 à 19:49:15
spiman a écrit : Après un test rapide sur un TOMCAT 4.1.27 si maxActive est à 0 ou -1 cela ne fonctionne pas. On a une exception : DBCP could not obtain an idle db connection. En repassant maxActive à 1 c'est OK. |
Bizarre ...
Citation : <!-- Maximum number of dB connections in pool. Make sure you |
Marsh Posté le 30-07-2004 à 11:26:36
oui j'ai vu ça aussi c'est dans l'exemple pour mysql mais je pense pas que le fait que ce soit une base PostGres change qqchose. Toujours est t'il que je n'arrive pas à le mettre en oeuvre. Maintenant ça n'a pas un intérêt phénoménal et ce n'est d'ailleurs pas possible de mettre nolimit sur d'autres serveurs d'application comme weblogic. Pour en revenir au sujet du topic le code proposé par tomcat est trés bien. Il faut absolument fermer les connections dans le finally et pas dans le try.
Marsh Posté le 30-07-2004 à 16:05:22
Bon et bien cette grosse de journée de modifs a été très utile !!!! Cela a réglé mes pb de pools !
Marsh Posté le 27-07-2004 à 11:07:53
Voila, j'ai implementé la methode "officielle" pour créer des pools de connexions avec Tomcat :
http://jakarta.apache.org/tomcat/t [...] howto.html
Le probleme, c'est que quand plus de 5 utilisateurs sont en même temps sur l'appli, j'ai pas assez de pools de connexions !!!!!!!!!!! et ça plante l'appli.
J'ai cette erreur :
org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted, cause:
java.util.NoSuchElementException: Timeout waiting for idle object
Alors qu'avec ceci cela doit etre suffisant :