How to configure JNDI in order to avoid the error "Last packet sent to the 
server was xxxxx ms ago."?  I've seen two other errors which seem to be from 
the same cause: "Communications link failure" and "Connection.close90 has 
already been called".

This is what I've come up with, but wonder if it is is good and efficient:

  <Resource name="jdbc/myname"
            auth="Container"
            type="javax.sql.DataSource"
            driverClassName="my.custom.mysql.Driver"
            url="[EMAIL PROTECTED]:mysql://localhost:3306"
            username="user"
            password="encode:abcdefg"
            initialSize="1" maxActive="15" maxIdle="15" 
minEvictableIdleTimeMillis="43200000"
            maxWait="5000" removeAbandoned="true" removeAbandonedTimeout="30" 
logAbandoned="true"
            testOnBorrow="true" testWhileIdle="true" validationQuery="select 
1"/>


The my.custom.mysql.Driver class decodes and decrypts the password, and passes 
these to the base class, which is com.mysql.jdbc.NonRegisteringDriver.

I read that the validationQuery="select 1" validates the connection before 
returning it to the user.  If the select statement fails, then the connection 
is removed from the pool and a new one is created.

What I'm not sure is if I need the testOnBorrow="true" and testWhileIdle="true".

The MySQL connection timeout is 12 hours, so I set 
minEvictableIdleTimeMillis="43200000".  From the doc at 
http://svn.apache.org/repos/asf/tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml,
 it looks like this is the minimum time that the connection may sit idle in the 
pool until it is considered for eviction/removal.  So I set the value to 12 
hours.  So I imagine that after 12 hours, the validation query will run and it 
will fail because the connection has been closed on the server, and so the idle 
connection will be removed.

In my case, the last packet was sent about 57xxx milliseconds ago, which is 
less than a minute, which is much less than the 12 hour MySQL connection 
timeout.  Yet the error happens only after around 12 hours.  I expect the error 
to be "... 43200000 ms ago" or something like that.

Also, I read that the validationQuery adds performance overhead, and maybe the 
Java code should handle exceptions.  But how would this work?  I'm guessing you 
catch the SQLException, and if it is "Last packet sent to the server was xxxxx 
ms ago" then call connection.reconnect and attempt the operation again.  But 
java.sql.Connection does not have a function reconnect.

The other thing I could try in code, is that after getting the connection by 
calling ctx.lookup("java:comp/env/jdbc/myname"), is to call 
connection.isValid() or connection.isClosed(), and if the connection is closed 
then call something to remove it from the pool.  But java.sql.Connection does 
not have a function removeMeFromThePoolIBelongTo().

Finally, I'm concerned about maxIdle="15" and removeAbandoned="true".  If a 
connection is used for a SQL statement then closed, it becomes idle.  But then, 
will it be removed?  Or does removeAbandoned="true" only apply to connections 
that are still active (i.e. connection.close() has not been called on it) for 
removeAbandonedTimeout="30" seconds?

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to