https://issues.apache.org/bugzilla/show_bug.cgi?id=49831

           Summary: Issue with closing XAConnections on MSSQL
           Product: Tomcat Modules
           Version: unspecified
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: jdbc-pool
        AssignedTo: dev@tomcat.apache.org
        ReportedBy: dmik...@vmware.com


When using XAConnections with MSSQL it has been noticed that the physical
connections are not being closed when DataSourceProxy.close(boolean all) is
called. This method invokes
org.apache.tomcat.jdbc.pool.PooledConnection.disconnent() which calls
connection.close(). However, when used with SQLServer, the connection attribute
is a proxy object (type
com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolProxy) which wraps the
physical connection (of type com.microsoft.sqlserver.jdbc.SQLServerConnection).
Calling close() on the proxy object only notifies the pool manager that the
Connection is released back to the pool; it does not close the underlying
physical connection.

This is what the PooledConnection.disconnent() implementation currently reads:

private void disconnect(boolean finalize) {
    if (isDiscarded()) {
        return;
    }
    setDiscarded(true);
    if (connection != null) {
        try {
            connection.close();
        }catch (Exception ignore) {
            if (log.isDebugEnabled()) {
                log.debug("Unable to close underlying SQL connection",ignore);
            }
        }
    }
    connection = null;
    xaConnection = null;
    lastConnected = -1;
    if (finalize) parent.finalize(this);
}

If the logic was changed to the following, it would properly closed the
XAConnection with the MSSQL.

private void disconnect(boolean finalize) {
    if (isDiscarded()) {
        return;
    }
    setDiscarded(true);
    if (connection != null) {
        try {
            if (xaConnection != null) {
                xaConnection.close(); 
            } else {
                connection.close();
            }
        }catch (Exception ignore) {
            if (log.isDebugEnabled()) {
                log.debug("Unable to close underlying SQL connection",ignore);
            }
        }
    }
    connection = null;
    xaConnection = null;
    lastConnected = -1;
    if (finalize) parent.finalize(this);
}

-- 
Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.

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

Reply via email to