synchronized void close() {
   if (--refCount == 0) {
     if (provider != null) {
       vertx.executeBlocking(
           future -> {
             try {
               provider.close(ds);
               future.complete();
             } catch (SQLException e) {
               future.fail(e);
             }
           },
           null);
     }
     if (exec != null) {
       exec.shutdown();
     }
     if (closeRunner != null) {
       closeRunner.run();
     }
   }
 }