@Override
    public void close() {

        if (closed.getAndSet(true)) {
            return;
        }

        // do this at call time, otherwise running the cleanables may affect the state of the other handle objects (e.g. the config)
        final boolean doForceEndTransactions = this.forceEndTransactions && getConfig().get(Handles.class).isForceEndTransactions();

        try {
            ThrowableSuppressor throwableSuppressor = new ThrowableSuppressor();

            doClean(throwableSuppressor);

            try {
                cleanConnection(doForceEndTransactions);
            } catch (Throwable t) {
                throwableSuppressor.attachToThrowable(t);
                throw t;
            }

            throwableSuppressor.throwIfNecessary(t -> new CloseException("While closing handle", t));
        } finally {
            LOG.trace("Handle [{}] released", this);

            notifyHandleClosed();
        }
    }
Closes the handle, its connection, and any other database resources it is holding.

@throws CloseException       if any resources throw exception while closing
@throws TransactionException if called while the handle has a transaction open. The open transaction will be
                             rolled back.
core/src/main/java/org/jdbi/v3/core/Handle.java