docs: private Driver loadDriver(final String className, String url, final ClassLoader classloader, Properties props, String dataSourceID) throws Exception {
          final boolean trace = TraceComponent.isAnyTracingEnabled();
          if (trace && tc.isDebugEnabled())
              Tr.entry(this, tc, "loadDriver", className, PropertyService.filterURL(url), classloader);
          int index = url.toLowerCase().indexOf("logintimeout");
          if(index != -1) {
              int length = url.length();
              index += 13;  //length of logintimeout=
              //check that the value after logintime= is 0
              if(index < length && !url.substring(index, index+1).equals("0")) {
                  throw new SQLNonTransientException(AdapterUtil.getNLSMessage("DSRA4005.invalid.logintimeout", dataSourceID));
              }
              if(index + 1 < length && !Character.isDigit(url.charAt(index+1))) { //check that the value after 0 (if there is one) is not numeric
                  throw new SQLNonTransientException(AdapterUtil.getNLSMessage("DSRA4005.invalid.logintimeout", dataSourceID));
              }
              if (trace && tc.isDebugEnabled())
                  Tr.debug(this, tc, "Allowing value of 0 for loginTimeout in URL");
          }
          
          Object loginTimeout = props.get("loginTimeout");
          if(loginTimeout != null && !loginTimeout.toString().equals("0")) {
              throw new SQLNonTransientException(AdapterUtil.getNLSMessage("DSRA4005.invalid.logintimeout", dataSourceID));
          }
  
          Iterable<Driver> drivers;
          if (className == null) {
              if (classloader == null)
                  drivers = ServiceLoader.load(Driver.class); // use thread context class loader of application
              else
                  drivers = ServiceLoader.load(Driver.class, classloader);
          } else { // load explicitly specified class
              Driver driver = AccessController.doPrivileged(new PrivilegedExceptionAction<Driver>() {
                  public Driver run() throws Exception {
                      ClassLoader loader = classloader == null ? Thread.currentThread().getContextClassLoader() : classloader;
                      Class<Driver> driverClass = (Class<Driver>) loader.loadClass(className);
                      return driverClass.newInstance();
                  }
              });
              drivers = Collections.singleton(driver);
          }
  
          SQLException failure = null;
          for (Driver driver : drivers) {
              boolean acceptsURL;
              try {
                  acceptsURL = driver.acceptsURL(url);
              } catch (SQLException x) {
                  if (failure == null)
                      failure = x;
                  acceptsURL = false;
              }
              if (acceptsURL) {
                  if (classloader != null && url.startsWith("jdbc:derby:") && isDerbyEmbedded.compareAndSet(false, true)) {
                      embDerbyRefCount.add(classloader);
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                          Tr.debug(this, tc, "ref count for shutdown", classloader, embDerbyRefCount);
                  }
  
                  if (trace && tc.isEntryEnabled())
                      Tr.exit(this, tc, "loadDriver", driver);
                  return driver;
              } else {
                  if (trace && tc.isDebugEnabled())
                      Tr.debug(this, tc, driver + " does not accept url");
              }
          }
  
          if (trace && tc.isEntryEnabled())
              Tr.exit(this, tc, "loadDriver", failure);
          if (failure == null)
              return null;
          else
              throw failure;
      }