Как проанализировать URL JDBC, чтобы получить имя хоста, порт и т. Д.? - PullRequest
28 голосов
/ 15 февраля 2012

Как я могу разобрать URL JDBC (oracle или sqlserver), чтобы получить имя хоста, порт и имя базы данных.Форматы URL разные.

Ответы [ 4 ]

48 голосов
/ 15 февраля 2012

Начните с чего-то вроде этого:

String url = "jdbc:derby://localhost:1527/netld;collation=TERRITORY_BASED:PRIMARY";
String cleanURI = url.substring(5);

URI uri = URI.create(cleanURI);
System.out.println(uri.getScheme());
System.out.println(uri.getHost());
System.out.println(uri.getPort());
System.out.println(uri.getPath());

Вывод из вышеперечисленного:

derby
localhost
1527
/netld;collation=TERRITORY_BASED:PRIMARY
6 голосов
/ 04 октября 2012

Это не сработало для меня. Я придумал эти методы, основываясь на предположении, что имя хоста и порт всегда объединяются двоеточием. Это предположение справедливо для всех баз данных, с которыми мне приходится иметь дело на работе (Oracle, Vertica, MySQL и т. Д.). Но это, вероятно, не работает для чего-то, что не достигает сетевого порта.

String url = null; // set elsewhere in the class
final public String regexForHostAndPort = "[.\\w]+:\\d+";
final public Pattern hostAndPortPattern = Pattern.compile(regexForHostAndPort);
public String getHostFromUrl() {
    Matcher matcher = hostAndPortPattern.matcher(url); 
    matcher.find();
    int start = matcher.start();
    int end = matcher.end();
    if(start >= 0 && end >= 0) {
        String hostAndPort = url.substring(start, end);
        String [] array = hostAndPort.split(":");
        if(array.length >= 2)
            return array[0];
    }
    throw new IllegalArgumentException("couldn't find pattern '" + regexForHostAndPort + "' in '" + url + "'");
}

public int getPortFromUrl() {
    Matcher matcher = hostAndPortPattern.matcher(url); 
    matcher.find();
    int start = matcher.start();
    int end = matcher.end();
    if(start >= 0 && end >= 0) {
        String hostAndPort = url.substring(start, end);
        String [] array = hostAndPort.split(":");
        if(array.length >= 2)
            return Integer.parseInt(array[1]);
    }
    throw new IllegalArgumentException("couldn't find pattern '" + regexForHostAndPort + "' in '" + url + "'");
}
1 голос
/ 10 августа 2018

Имейте в виду, что ответ @ brettw может не сработать для некоторых допустимых URL-адресов jdbc. Если имя хоста содержит подчеркивание, то uri getHost () возвращает ноль (см. здесь ), а getPost () возвращает -1.

Чтобы обойти это, я добавил проверку на нулевой хост:

  String jdbcUrl = "jdbc:jtds:sqlserver://ABC_XYZ:1433/Database";
  String cleanURI = jdbcUrl.substring("jdbc:jtds:".length());

  URI uri = URI.create(cleanURI);
  String host = uri.getHost();
  int port = uri.getPort();

  if(host == null){
    String regex = ".*://(\\w*):(\\d++)/.*";
    Pattern p = Pattern.compile(regex);

    Matcher matcher = p.matcher(jdbcUrl);
    if(matcher.find()){
      host =  matcher.group(1);
      port =  Integer.valueOf(matcher.group(2));
    } else {
      // handle fail
    }
  }

  System.out.println("host = " + host);
  System.out.println("port = " + port);
1 голос
/ 26 января 2016

Я использую этот класс в своих проектах.Использование действительно просто.

/**
 * Split di una url JDBC nei componenti.
 * Estrae i componenti di una uri JDBC del tipo: <br>
 * String url = "jdbc:derby://localhost:1527/netld;collation=TERRITORY_BASED:PRIMARY"; <br>
 * nelle rispettive variabili pubbliche.
 * @author Nicola De Nisco
 */
public class JdbcUrlSplitter
{
  public String driverName, host, port, database, params;

  public JdbcUrlSplitter(String jdbcUrl)
  {
    int pos, pos1, pos2;
    String connUri;

    if(jdbcUrl == null || !jdbcUrl.startsWith("jdbc:")
       || (pos1 = jdbcUrl.indexOf(':', 5)) == -1)
      throw new IllegalArgumentException("Invalid JDBC url.");

    driverName = jdbcUrl.substring(5, pos1);
    if((pos2 = jdbcUrl.indexOf(';', pos1)) == -1)
    {
      connUri = jdbcUrl.substring(pos1 + 1);
    }
    else
    {
      connUri = jdbcUrl.substring(pos1 + 1, pos2);
      params = jdbcUrl.substring(pos2 + 1);
    }

    if(connUri.startsWith("//"))
    {
      if((pos = connUri.indexOf('/', 2)) != -1)
      {
        host = connUri.substring(2, pos);
        database = connUri.substring(pos + 1);

        if((pos = host.indexOf(':')) != -1)
        {
          port = host.substring(pos + 1);
          host = host.substring(0, pos);
        }
      }
    }
    else
    {
      database = connUri;
    }
  }
}
...