Configuration de Tomcat à l'aide de DBCP

Nous obtenons un CommunicationsException (à partir de DBCP) après en divisant pendant un certain temps (quelques heures). Le message d'erreur (Exception) est à la fin de cette question - mais je ne vois pas wait_timeout défini dans l'une quelconque des fichiers de configuration. (Où devons-nous chercher? Quelque part hors de la tomcat/conf répertoire?).

Deuxièmement, comme l'a suggéré l'Exception, où l'on a mis le "Connector/J propriétés de connexion 'autoReconnect=true'"? Voici la définition de la ressource dans le fichier conf/context.xml dans tomcat mis en place:

<Resource name="jdbc/TomcatResourceName" auth="Container" type="javax.sql.DataSource"
           maxActive="100" maxIdle="30" maxWait="10000"
           removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
           username="xxxx" password="yyyy"
           driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://127.0.0.1:3306/dbname?autoReconnect=true"/>

Troisièmement, pourquoi ne la JVM attendre jusqu'à l'appel à executeQuery() pour lancer l'Exception? Si la connexion a expiré, la méthode getConnection devriez jeter l'Exception, n'est-ce pas? C'est la section du code source je parle:

        try {
                conn = getConnection (true);
                stmt = conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
                                                ResultSet.CONCUR_READ_ONLY);
                rset = stmt.executeQuery (bQuery);
                while (rset.next()) {
                     ....

Enfin, voici la 1ère quelques lignes de la trace de la Pile...

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 84,160,724 milliseconds ago.  The last packet sent successfully to the server was 84,160,848 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3291)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1938)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2107)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2642)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2571)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1451)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)

Ce sont les raisons pour lesquelles certains d'entre nous pensent "oublier dbcp, il peut être dépendant des IDE configurations et sous le capot de la magie que DriverManager.getConnection(...) peut être plus fiable". Tous les commentaires sur qui? Merci pour vos idées, - MME

OriginalL'auteur Manidip Sengupta | 2011-02-09