tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Henning Rohlfs <henning.roh...@splitscreenstudios.com>
Subject NPE in ResultSetImpl.next() using tomcat jdbc pool
Date Thu, 10 Oct 2013 14:01:56 GMT
Hello,

I've been trying to figure this problem out for some time now and I'm
totally stuck. The Exception in question is the following:
Caused by: java.lang.NullPointerException
        at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:7009)
        at
com.server.persistence.state.connectors.jdbc.JDBCCleanupStateConnector.getUUIDsByTable(JDBCCleanupStateConnector.java:140)
        ... 8 more

It occurs very infrequently (and unfortunately I have not been able to
reproduce it yet). I have also checked all occurences of getConnection().
Every one of them is wrapped (like below) by try {} finally {if (con !=
null) con.close();}. Connections are not stored locally and used by other
threads later as far as I can tell either.
The last time this problem occured, the thread in question was actually
stuck for 10 minutes (as far as I reconstruct) before the NPE was thrown.
During this time, the thread was seemingly stuck on
SocketInputStream.socketRead0 (see below for stack trace), even though I
set the sockettimeout when creating the db pool.

Best regards
 Henning Rohlfs


    @Override
    public List<String> getUUIDsByTable( final String table) throws
TableNotFoundException {
        Connection connection = null;
        try {
            connection = stateDbIo.getConnection();
            final PreparedStatement ps = connection.prepareStatement(
"SELECT uuid FROM `" + table+ "` GROUP BY uuid" );
            final ResultSet rs = ps.executeQuery();
            final List<String> result = new ArrayList<String>();
            while ( rs.next() ) { //this is where the exception is thrown
                result.add( rs.getString( UUID_COLUMN ) );
            }
            return result;
        } catch ( final Exception e ) {
            throw new TableNotFoundException( table, e );
        } finally {
            if ( connection != null ) {
                try {
                    connection.close();
                } catch ( final SQLException e ) {
                    // ignore
                }
            }
        }
    }


I'm using the tomcat jdbc database pool (7.0.42) to get the connections.

stateDbIo.getConnection():
    public Connection getConnection() throws SQLException {
        if ( dataSource != null ) {
            final Connection connection = dataSource.getConnection();
            connection.setReadOnly( readOnly );
            connection.setAutoCommit( true );
            return connection;
        }
        return null;
    }


Connection pool settings:
    protected String initialSize = "0";
    protected String maxActive = "8";
    protected String maxIdle = "8";
    protected String minIdle = "0";
    protected String timeBetweenEvictionRunsMillis = "30000";
    protected String minEvictableIdleTimeMillis = "60000";
    protected String validationQuery = "SELECT 1";
    protected String validationInterval = "30000";
    protected String testOnBorrow = "true";
    protected String removeAbandoned = "true";
    protected String removeAbandonedTimeout = "60";
    protected String logAbandoned = "true";
    protected String jdbcInterceptors =
"org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;" +
            "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;" +
            "org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer";
    protected String connectionProperties =
"[connectTimeout=90000;socketTimeout=90000;]";

        props = new Properties();
        props.put( "url", url );
        props.put( "driverClassName", driverClass );
        props.put( "username", username );
        props.put( "password", password );
        props.put( "initialSize", initialSize );
        props.put( "maxActive", maxActive );
        props.put( "maxIdle", maxIdle );
        props.put( "minIdle", minIdle );
        props.put( "timeBetweenEvictionRunsMillis",
timeBetweenEvictionRunsMillis );
        props.put( "minEvictableIdleTimeMillis", minEvictableIdleTimeMillis
);
        props.put( "validationQuery", validationQuery );
        props.put( "validationInterval", validationInterval );
        props.put( "testOnBorrow", testOnBorrow );
        props.put( "removeAbandoned", removeAbandoned );
        props.put( "removeAbandonedTimeout", removeAbandonedTimeout ); //
seconds
        props.put( "logAbandoned", logAbandoned );
        props.put( "connectionProperties", connectionProperties );
        props.put( "jdbcInterceptors", jdbcInterceptors );
        return new DataSourceFactory().createDataSource( props );


Stack trace of stuck thread before it threw the exception:
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:150)
        at java.net.SocketInputStream.read(SocketInputStream.java:121)
        at
com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)
        at
com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)
        at
com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
        - locked <0x000000063bc4b2a8> (a
com.mysql.jdbc.util.ReadAheadInputStream)
        at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3049)
        at com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java:2157)
        at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1932)
        at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:3437)
        at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:488)
        at
com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:3131)
        at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2299)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2722)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815)
        - locked <0x000000062f772b78> (a com.mysql.jdbc.JDBC4Connection)
        at
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
        - locked <0x000000062f772b78> (a com.mysql.jdbc.JDBC4Connection)
        at
com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2322)
        - locked <0x000000062f772b78> (a com.mysql.jdbc.JDBC4Connection)
        at sun.reflect.GeneratedMethodAccessor87.invoke(Unknown Source)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at
org.apache.tomcat.jdbc.pool.interceptor.AbstractQueryReport$StatementProxy.invoke(AbstractQueryReport.java:235)
        at com.sun.proxy.$Proxy1.executeQuery(Unknown Source)
        at
com.server.persistence.state.connectors.jdbc.JDBCCleanupStateConnector.getUUIDsByTable(JDBCCleanupStateConnector.java:138)
        ...

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