public Handle open() {
        try {
            final long start = System.nanoTime();
            @SuppressWarnings("PMD.CloseResource")
            Connection conn = Objects.requireNonNull(connectionFactory.openConnection(),
                    () -> "Connection factory " + connectionFactory + " returned a null connection");
            final long stop = System.nanoTime();

            try {
                for (JdbiPlugin p : plugins) {
                    conn = p.customizeConnection(conn);
                }

                StatementBuilder cache = statementBuilderFactory.get().createStatementBuilder(conn);

                Handle h = Handle.createHandle(this,
                        connectionFactory.getCleanableFor(conn), // don't use conn::close, the cleanup must be done by the connection factory!
                        transactionhandler.get(),
                        cache,
                        conn);

                for (JdbiPlugin p : plugins) {
                    h = p.customizeHandle(h);
                }
                LOG.trace("Jdbi [{}] obtain handle [{}] in {}ms", this, h, MILLISECONDS.convert(stop - start, NANOSECONDS));
                return h;
            } catch (Throwable t) {
                connectionFactory.getCleanableFor(conn).closeAndSuppress(t);
                throw t;
            }
        } catch (SQLException e) {
            throw new ConnectionException(e);
        }
    }
Obtain a Handle to the data source wrapped by this Jdbi instance.
You own this expensive resource and are required to close it or
risk leaks.  Using a {@code try-with-resources} block is recommended.

@return an open Handle instance
@see #useHandle(HandleConsumer)
@see #withHandle(HandleCallback)
core/src/main/java/org/jdbi/v3/core/Jdbi.java