docs: public void close() throws SQLException {
  		try {
  
  			if (this.resetConnectionOnClose /*FIXME: && !getAutoCommit() && !isTxResolved() */){
  				/*if (this.autoCommitStackTrace != null){
  						logger.debug(this.autoCommitStackTrace);
  						this.autoCommitStackTrace = null; 
  					} else {
  						logger.debug(DISABLED_AUTO_COMMIT_WARNING);
  					}*/
  				rollback();
  				if (!getAutoCommit()){
  					setAutoCommit(true);
  				}
  			}
  
  			if (this.logicallyClosed.compareAndSet(false, true)) {
  
  
  				if (this.threadWatch != null){
  					this.threadWatch.interrupt(); // if we returned the connection to the pool, terminate thread watch thread if it's
  					// running even if thread is still alive (eg thread has been recycled for use in some
  					// container).
  					this.threadWatch = null;
  				}
  
  				if (this.closeOpenStatements){
  					for (Entry<Statement, String> statementEntry: this.trackedStatement.entrySet()){
  						statementEntry.getKey().close();
  						if (this.detectUnclosedStatements){
  							logger.warn(String.format(UNCLOSED_LOG_ERROR_MESSAGE, statementEntry.getValue()));		
  						}
  					}
  					this.trackedStatement.clear();
  				} 
  
  				if (!this.connectionTrackingDisabled){
  					pool.getFinalizableRefs().remove(this.connection);
  				}
  
  				ConnectionHandle handle = null;
  
  				//recreate can throw a SQLException in constructor on recreation
  				try {
  				    handle = this.recreateConnectionHandle();
  				    this.pool.connectionStrategy.cleanupConnection(this, handle);
  				    this.pool.releaseConnection(handle);				    
  				} catch(SQLException e) {
  				    //check if the connection was already closed by the recreation
  				    if (!isClosed()) {
  				    	this.pool.connectionStrategy.cleanupConnection(this, handle);
  				    	this.pool.releaseConnection(this);
  				    }
  				    throw e;
  				}
  				
  				
  				if (this.doubleCloseCheck){
  					this.doubleCloseException = this.pool.captureStackTrace(CLOSED_TWICE_EXCEPTION_MESSAGE);
  				}
  			} else {
  				if (this.doubleCloseCheck && this.doubleCloseException != null){
  					String currentLocation = this.pool.captureStackTrace("Last closed trace from thread ["+Thread.currentThread().getName()+"]:\n");
  					logger.error(String.format(LOG_ERROR_MESSAGE, this.doubleCloseException, currentLocation));
  				}
  			}
  		} catch (SQLException e) {
  			throw markPossiblyBroken(e);
  		}
  	}