[ 
https://issues.apache.org/jira/browse/DBCP-413?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13964908#comment-13964908
 ] 

Bernd Eckenfels commented on DBCP-413:
--------------------------------------

I have used the follwing test code:

{code}
package test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.ConnectionFactory;
import org.apache.commons.dbcp2.DriverManagerConnectionFactory;
import org.apache.commons.dbcp2.PoolableConnection;
import org.apache.commons.dbcp2.PoolableConnectionFactory;
import org.apache.commons.dbcp2.PoolingDataSource;
import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPool;


public class DBCPTest
{

    public static void main(String[] args) throws SQLException
    {
        DataSource ds = setupDataSource("jdbc:h2:target/testdb");
        Connection c = ds.getConnection();
        PreparedStatement ps = c.prepareStatement("SELECT 1 FROM DUAL");
        System.out.println("impls: connection=" + c.getClass() + " ps=" + 
ps.getClass());
        c.close();
        System.out.println("ps is closed? " + ps.isClosed());
        ps.close();
    }


    public static DataSource setupDataSource(String connectURI)
    {
        ConnectionFactory connectionFactory = new 
DriverManagerConnectionFactory(connectURI,null);
        PoolableConnectionFactory poolableConnectionFactory = new 
PoolableConnectionFactory(connectionFactory, null);
        ObjectPool<PoolableConnection> connectionPool = new 
GenericObjectPool<>(poolableConnectionFactory);
        poolableConnectionFactory.setPool(connectionPool);
        PoolingDataSource<PoolableConnection> dataSource = new 
PoolingDataSource<>(connectionPool);
        return dataSource;
    }
}
{code}

And with H2 database it returns true for isClosed() and it silently skips the 
close on the ps:

{code}
impls: connection=class 
org.apache.commons.dbcp2.PoolingDataSource$PoolGuardConnectionWrapper ps=class 
org.apache.commons.dbcp2.DelegatingPreparedStatement
ps is closed? true
{code}

I suggest the OP tries it with MSSQL and jTDS drivers.

> Closing a Connection does not close Statement objects created on that 
> connection, by way of the close() method.
> ---------------------------------------------------------------------------------------------------------------
>
>                 Key: DBCP-413
>                 URL: https://issues.apache.org/jira/browse/DBCP-413
>             Project: Commons Dbcp
>          Issue Type: Bug
>    Affects Versions: 1.4
>            Reporter: Mark W
>            Priority: Minor
>
> While using the MS SQL 2012 jdbc drivers with dbcp, I noticed that if you 
> create a connection, then create a preparedStatement from that connection, 
> and close the connection object, PreparedStatement.isClosed() will return 
> false, but you will get a SQLException stating the statement has been closed 
> if you attempt to call any of the set or execute methods.
> From the JDBC spec:
> Connection.close
> An application calls the method Connection.close() to indicate that it has 
> finished using a connection. All Statement objects created from a given 
> Connection object will be closed when the close method for the Connection 
> object is called.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to