Bug #35489 JDBC4PreparedStatementWrapper: NPE on close()
Submitted: 21 Mar 2008 20:57 Modified: 25 Jul 2008 15:17
Reporter: Jens Elkner
Status: Closed
Category:Connector/J Severity:S1 (Critical)
Version:5.1.6 OS:Any
Assigned to: Mark Matthews Target Version:

[21 Mar 2008 20:57] Jens Elkner
Description:
The JDBC4PreparedStatementWrapper.close() calls StatementWrapper.close() which in turn
sets the instance's  pooledConnection to 'null'. After that, it tries to fire a
StatementEvent using this.pooledConnection, which has been already set to 'null'. So one
always gets an NPE if one tries to close a JDBC4 enhanced prepared statement.

How to repeat:
try to close an successfully executed pstmt.

Suggested fix:
---
mysql-connector-java-5.1.6/src/com/mysql/jdbc/jdbc2/optional/JDBC4PreparedStatementWrapper.java
    Wed Mar  5 17:27:00 2008
+++
../mysql-connector-java-5.1.6/src/com/mysql/jdbc/jdbc2/optional/JDBC4PreparedStatementWrapper.java
 Fri Mar 21 20:06:25 2008
@@ -63,12 +63,13 @@
        }

        public void close() throws SQLException {
+               JDBC4MysqlPooledConnection con =
+                       (JDBC4MysqlPooledConnection) this.pooledConnection;
                try {
                        super.close();
                } finally {
                        try {
-                              
((JDBC4MysqlPooledConnection)this.pooledConnection).fireStatementEvent(
-                                               new StatementEvent(this.pooledConnection,
this));
+                               con.fireStatementEvent(new StatementEvent(con, this));
                        } finally {
                                this.unwrappedInterfaces = null;
                        }
[15 Apr 2008 0:53] Ed Hager
I ran into the same problem trying to use
com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource with Hibernate and Resin:

Caused by: java.lang.IllegalArgumentException: null source
at java.util.EventObject.<init>(EventObject.java:38)
at javax.sql.StatementEvent.<init>(StatementEvent.java:39)
at
com.mysql.jdbc.jdbc2.optional.JDBC4PreparedStatementWrapper.close(JDBC4PreparedStatementWrapper.java:70)
at com.caucho.sql.UserStatement.close(UserStatement.java:127)
at com.caucho.sql.UserPreparedStatement.close(UserPreparedStatement.java:450)
at org.hibernate.jdbc.AbstractBatcher.closePreparedStatement(AbstractBatcher.java:534)
[15 Apr 2008 23:00] Jens Elkner
NOTE: http://iws.cs.uni-magdeburg.de/~elkner/mysql/java/5.1.6-jdbc4-stmt-close-NPE.patch

got an update, since the initial patch took care of PooledConnection, only. The update
fixes XA and SuspendableXAConnections as well.
[16 Jul 2008 16:59] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/49848
[25 Jul 2008 15:17] Tony Bedford
An entry has been added to the 5.1.6 changelog:

Prepared statements from pooled connections caused a NullPointerException when closed()
under JDBC-4.0.
[30 Jul 2008 16:53] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/50724