@Override
  public Connection getConnection() throws SQLException {
    if (!CurrentUnitOfWork.isStarted()
        || CurrentUnitOfWork.get().phase().isAfter(UnitOfWork.Phase.PREPARE_COMMIT)) {
      return delegate.getConnection();
    }

    UnitOfWork<?> uow = CurrentUnitOfWork.get();
    Connection connection = uow.root().getResource(CONNECTION_RESOURCE_NAME);
    if (connection == null || connection.isClosed()) {
      final Connection delegateConnection = delegate.getConnection();
      connection =
          ConnectionWrapperFactory.wrap(
              delegateConnection,
              UoWAttachedConnection.class,
              new UoWAttachedConnectionImpl(delegateConnection),
              new ConnectionWrapperFactory.NoOpCloseHandler());
      uow.root().resources().put(CONNECTION_RESOURCE_NAME, connection);
      uow.onCommit(
          u -> {
            Connection cx = u.root().getResource(CONNECTION_RESOURCE_NAME);
            try {
              if (!cx.isClosed() && !cx.getAutoCommit()) {
                cx.commit();
              }
            } catch (SQLException e) {
              throw new JdbcException("Unable to commit transaction", e);
            }
          });
      uow.onCleanup(
          u -> {
            Connection cx = u.root().getResource(CONNECTION_RESOURCE_NAME);
            JdbcUtils.closeQuietly(cx);
            if (cx instanceof UoWAttachedConnection) {
              ((UoWAttachedConnection) cx).forceClose();
            }
          });
      uow.onRollback(
          u -> {
            Connection cx = u.root().getResource(CONNECTION_RESOURCE_NAME);
            try {
              if (!cx.isClosed() && !cx.getAutoCommit()) {
                cx.rollback();
              }
            } catch (SQLException ex) {
              throw new JdbcException("Unable to rollback transaction", ex);
            }
          });
    }
    return connection;
  }
 @Override
 public void forceClose() {
   JdbcUtils.closeQuietly(delegateConnection);
 }