commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Thomas Neidhart (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (DBCP-372) Statement Leak occurs when batch update is used.
Date Wed, 07 Nov 2012 16:07:13 GMT

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

Thomas Neidhart commented on DBCP-372:
--------------------------------------

Indeed, the current passivate method in PoolablePreparedStatement does the following:

{noformat}
    public void passivate() throws SQLException {
        _closed = true;
        if(_conn != null) {
            _conn.removeTrace(this);
        }

        // The JDBC spec requires that a statement closes any open
        // ResultSet's when it is closed.
        // FIXME The PreparedStatement we're wrapping should handle this for us.
        // See bug 17301 for what could happen when ResultSets are closed twice.
        List<AbandonedTrace> resultSets = getTrace();
        if( resultSets != null) {
            ResultSet[] set = resultSets.toArray(new ResultSet[resultSets.size()]);
            for (int i = 0; i < set.length; i++) {
                set[i].close();
            }
            clearTrace();
        }
        if (batchAdded) {
            clearBatch();
        }
        
        super.passivate();
    }
{noformat}

Thus, indicating that the connection is closed first, and then afterwards trying to clear
any batches. Now the clearBatch method throws an exception if the connection is already marked
as closed.

Imho, the suggested fix would be fine, but we could also change the passivate method to call
clearBatch before setting _closed to true.
                
> Statement Leak occurs when batch update is used.
> ------------------------------------------------
>
>                 Key: DBCP-372
>                 URL: https://issues.apache.org/jira/browse/DBCP-372
>             Project: Commons Dbcp
>          Issue Type: Bug
>    Affects Versions: 1.3, 1.4
>         Environment: Oracle 11g
>            Reporter: Naozumi Taromaru
>            Priority: Critical
>             Fix For: 1.4.1
>
>
> org.apache.commons.dbcp.PoolablePreparedStatement#passivate()
> execute clearBatch().
> (DBCP-264)
> But this clearBatch() throw SQLException.
> (DelegatingStatement#checkOpen() throw SQLException, because _closed is true.)
> The result,
> the PoolablePreparedStatement doesn't return to pool, and
> the PoolablePreparedStatement doesn't execute PreparedStatement#close().
> When a lot of data is processed, 
> in the case of Oracle
>  * ORA-00604
>  * ORA-01000
> occurs.
> Proposal:
> "clearBatch();" in passivate() method
> changes as follows.
> batchAdded = false;
> getInnermostDelegate().clearBatch();

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message