This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-dbcp.git
commit 7d5fcc9182c038e77e39511077d0ac3d005cc077 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Fri Jan 20 09:22:33 2023 -0500 Throw SQLException instead of NullPointerException when the connection is already closed in PooledConnectionImpl --- src/changes/changes.xml | 3 ++ .../dbcp2/cpdsadapter/PooledConnectionImpl.java | 32 ++++++++++++++++------ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 7942f2a7..fc8a880b 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -113,6 +113,9 @@ The <action> type attribute can be add,update,fix,remove. <action dev="ggregory" type="fix" due-to="Gary Gregory"> Wrong property name logged in ConnectionFactoryFactory.createConnectionFactory(BasicDataSource, Driver). </action> + <action dev="ggregory" type="fix" due-to="Gary Gregory"> + Throw SQLException instead of NullPointerException when the connection is already closed. + </action> <!-- ADD --> <action dev="ggregory" type="add" due-to="Gary Gregory"> Add and use AbandonedTrace#setLastUsed(Instant). diff --git a/src/main/java/org/apache/commons/dbcp2/cpdsadapter/PooledConnectionImpl.java b/src/main/java/org/apache/commons/dbcp2/cpdsadapter/PooledConnectionImpl.java index 33b0c724..5de13c9a 100644 --- a/src/main/java/org/apache/commons/dbcp2/cpdsadapter/PooledConnectionImpl.java +++ b/src/main/java/org/apache/commons/dbcp2/cpdsadapter/PooledConnectionImpl.java @@ -380,6 +380,11 @@ final class PooledConnectionImpl return logicalConnection; } + private Connection getRawConnection() throws SQLException { + assertOpen(); + return connection; + } + private String getSchemaOrNull() { try { return connection == null ? null : Jdbc41Bridge.getSchema(connection); @@ -460,9 +465,10 @@ final class PooledConnectionImpl * Thrown if a database access error occurs or this method is called on a closed connection. * @since 2.4.0 */ + @SuppressWarnings("resource") // getRawConnection() does not allocate CallableStatement prepareCall(final String sql) throws SQLException { if (pStmtPool == null) { - return connection.prepareCall(sql); + return getRawConnection().prepareCall(sql); } try { return (CallableStatement) pStmtPool.borrowObject(createKey(sql, StatementType.CALLABLE_STATEMENT)); @@ -492,10 +498,11 @@ final class PooledConnectionImpl * parameters are not {@code ResultSet} constants indicating type and concurrency. * @since 2.4.0 */ + @SuppressWarnings("resource") // getRawConnection() does not allocate CallableStatement prepareCall(final String sql, final int resultSetType, final int resultSetConcurrency) throws SQLException { if (pStmtPool == null) { - return connection.prepareCall(sql, resultSetType, resultSetConcurrency); + return getRawConnection().prepareCall(sql, resultSetType, resultSetConcurrency); } try { return (CallableStatement) pStmtPool.borrowObject( @@ -529,10 +536,11 @@ final class PooledConnectionImpl * parameters are not {@code ResultSet} constants indicating type, concurrency, and holdability. * @since 2.4.0 */ + @SuppressWarnings("resource") // getRawConnection() does not allocate CallableStatement prepareCall(final String sql, final int resultSetType, final int resultSetConcurrency, final int resultSetHoldability) throws SQLException { if (pStmtPool == null) { - return connection.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability); + return getRawConnection().prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability); } try { return (CallableStatement) pStmtPool.borrowObject(createKey(sql, resultSetType, resultSetConcurrency, @@ -552,9 +560,10 @@ final class PooledConnectionImpl * @throws SQLException Thrown if a database access error occurs, this method is called on a closed connection, or * the borrow failed. */ + @SuppressWarnings("resource") // getRawConnection() does not allocate PreparedStatement prepareStatement(final String sql) throws SQLException { if (pStmtPool == null) { - return connection.prepareStatement(sql); + return getRawConnection().prepareStatement(sql); } try { return pStmtPool.borrowObject(createKey(sql)); @@ -578,9 +587,10 @@ final class PooledConnectionImpl * the borrow failed. * @see Connection#prepareStatement(String, int) */ + @SuppressWarnings("resource") // getRawConnection() does not allocate PreparedStatement prepareStatement(final String sql, final int autoGeneratedKeys) throws SQLException { if (pStmtPool == null) { - return connection.prepareStatement(sql, autoGeneratedKeys); + return getRawConnection().prepareStatement(sql, autoGeneratedKeys); } try { return pStmtPool.borrowObject(createKey(sql, autoGeneratedKeys)); @@ -609,10 +619,11 @@ final class PooledConnectionImpl * the borrow failed. * @see Connection#prepareStatement(String, int, int) */ + @SuppressWarnings("resource") // getRawConnection() does not allocate PreparedStatement prepareStatement(final String sql, final int resultSetType, final int resultSetConcurrency) throws SQLException { if (pStmtPool == null) { - return connection.prepareStatement(sql, resultSetType, resultSetConcurrency); + return getRawConnection().prepareStatement(sql, resultSetType, resultSetConcurrency); } try { return pStmtPool.borrowObject(createKey(sql, resultSetType, resultSetConcurrency)); @@ -623,10 +634,11 @@ final class PooledConnectionImpl } } + @SuppressWarnings("resource") // getRawConnection() does not allocate PreparedStatement prepareStatement(final String sql, final int resultSetType, final int resultSetConcurrency, final int resultSetHoldability) throws SQLException { if (pStmtPool == null) { - return connection.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability); + return getRawConnection().prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability); } try { return pStmtPool.borrowObject(createKey(sql, resultSetType, resultSetConcurrency, resultSetHoldability)); @@ -637,9 +649,10 @@ final class PooledConnectionImpl } } + @SuppressWarnings("resource") // getRawConnection() does not allocate PreparedStatement prepareStatement(final String sql, final int[] columnIndexes) throws SQLException { if (pStmtPool == null) { - return connection.prepareStatement(sql, columnIndexes); + return getRawConnection().prepareStatement(sql, columnIndexes); } try { return pStmtPool.borrowObject(createKey(sql, columnIndexes)); @@ -650,9 +663,10 @@ final class PooledConnectionImpl } } + @SuppressWarnings("resource") // getRawConnection() does not allocate PreparedStatement prepareStatement(final String sql, final String[] columnNames) throws SQLException { if (pStmtPool == null) { - return connection.prepareStatement(sql, columnNames); + return getRawConnection().prepareStatement(sql, columnNames); } try { return pStmtPool.borrowObject(createKey(sql, columnNames));