tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Casey Merrill <CMerr...@apptio.com>
Subject Connection Pool only evicts closed connections when validator runs?
Date Thu, 22 Mar 2018 19:33:37 GMT
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);
        }
    }

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message