-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Henning,

On 10/10/13 10:01 AM, Henning Rohlfs wrote:
> 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

Looks like a bug in Connector/J. Are you up-to-date?

> 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.

The connection pool probably gave-up on the connection and possibly
closed it. In that case, calling ResultSet.next() might have confused
Connector/J's implementation because the ResultSet should have been
killed by then.

> @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 } } } }

Don't forget to close your PreparedStatement and ResultSet objects.
Yes, I know that the JDBC spec says that closing the Connection should
close the associated objects (i.e. statement, result set), but in a
pooled situation, sometimes the JDBC specs break down a bit and
drivers (and pools) don't always follow things to the letter.

> 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; }

It would be better to set the read-only and auto-commit flags based
upon the defaultAutoCommit and defaultReadOnly attributes of the pool
you configure. Then you don't have to worry about them ;)

I would guess that this is a MySQL Connector/J bug and not your fault.
That doesn't mean it's not your problem, though ;)

It sounds like you've done enough research to determine the problem
(timeout) so maybe you can create a small test-case that reproduces
it? I don't think it's got anything to do with Tomcat or tomcat-jdbc.
You should be able to rig-up a test case with a simple Java program
that connects to MySQL, then issues a long-running query (e.g. SELECT
SLEEP(10)) while the driver's timeout time is something less than 10
seconds. That should cause a disconnect during the query execution,
and subsequently calling ResultSet.next might fail.

Let us know how it goes.

- -chris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.14 (Darwin)
Comment: GPGTools - http://gpgtools.org
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQIcBAEBCAAGBQJSVt4eAAoJEBzwKT+lPKRYt3EP/2iwF06+k4PeXATa8yUaSGJy
Ip5bEzb29qxn0VW3yPO9BvEnRsH5p8GLclqEbyd/S9qJuHfCWpf7BrnzQi68zQzC
4dadOY9kx+MtAzQeuvR0thBsOOwZLZHWaCkNZrwbuYrHX72vrbsa7jWfSVycXI8O
EQ1xJiEkzTJNYgI4rQ2SLc8Z0oj+86lzM+4Lpu3zoDX1i6CQclhgqKOeaa1fHhQW
HD75qI1hhyeWpwZRTDH9vsxmDO0W0S6LmxJNfxemlMhIv/MUrk4sSlA5rLsNqpyY
I0WIOAw5nxUHqXUmnd0flRIgLIBwieddmPZxXGXQgAzncgaWF90kpd9m5Rh3ty/G
mPKx98+EKlAJxaVUCczsyqGoTHBurFC6e6wav0aHek7fwUHZRfiqWJ0tsFeneiMP
Im+Sah3G2NBMahKw3TNcugkL+3aPgeDN48mgY2qgBE1c1mbbCNhnRbtZgTnQh3MF
zj+HKy2nvjExSpKAZttgad6HgEcHNP5e5rjUrLs9Mmax52HsN3ghn1qHmBylDRTy
E0b74EFNsDDJ1XH+k0olaqHrfhGIrQLihD8Jlu/gNhbKrNkJzIubGIsf7uvtS7KF
ksSxIyndIvNnQk4+9bX7zmK2ZPWACh8efbOFH6DcXXlHf/juxJYSnp4x3fHbdxIf
apaiMEQhUI68N+zaRl4b
=3Xdw
-----END PGP SIGNATURE-----

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to