I’m currently using Dropwizard + Jooq and Tomcat jdbc for the connection pool.  
I’m seeing issues when a connection dies it’s not evicted from the connection 
pool until the validator runs.  While I can turn the rate up at which the 
validator runs its seems odd that a closed connection is returned to the pool.

Example error: (repeats with different queries many times before the connection 
is killed)
....user`.`login` WHERE `session`.`id` = ?]; No operations allowed after 
connection closed.
....
at org.jooq_3.9.1.MYSQL.debug(Unknown Source) ... Caused by: 
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No 
operations allowed after connection closed. ... Caused by: 
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link 
failure The last packet successfully received from the server was 11,618 
milliseconds ago. The last packet sent successfully to the server was 5,005 
milliseconds ago. ... 1 common frames omitted Caused by: 
java.net.SocketTimeoutException: Read timed out ... 28 common frames omitted


I’m able to fix this by getting a reference to the connection and manually 
setting it to discarded, but his is quite hackey.

ConnectionListener extends DefaultExecuteListener {
...

    public ConnectionListener() {}

    @Override
    public void exception(ExecuteContext ctx) {
        try {
            if (ctx != null && ctx.exception() != null) {
                //Proceed to check if we recieved a DataAccessException
                if (ctx.exception() instanceof DataAccessException) {
                    DataAccessException exception = (DataAccessException) 
ctx.exception();

                    //If the error is network related discard the connection
                    if (isNetworkError(exception)) {
                        //The underlying ProxyConnection which we need to call  
setDiscarded is a few levels deep
                        Connection conn = ctx.connection();
                        DefaultConnection dConn = (DefaultConnection) conn;
                        SettingsEnabledConnection sConn = 
(SettingsEnabledConnection) dConn;
                        ProviderEnabledConnection pConn = 
(ProviderEnabledConnection) sConn.getDelegate();

                        //Get the Proxy connection handler
                        InvocationHandler handler = 
Proxy.getInvocationHandler(pConn.getDelegate());

                        //Get the Proxy connection
                        ProxyConnection proxyConnection = (ProxyConnection)
                                ((DisposableConnectionFacade) 
handler).getNext();

                        //Discard the connection
                        proxyConnection.getConnection().setDiscarded(true);
                    }
                }
            }
        } catch (Exception e) {
            logger.error("ConnectionListener caught unexpected error", e);
        }
    }

Reply via email to