2012-02-15 12 views
22

W jaki sposób można przeanalizować adres URL JDBC (Oracle lub sqlserver), aby uzyskać nazwę hosta, port i nazwę bazy danych. Formaty adresu URL są różne.Jak analizować adres URL JDBC, aby uzyskać nazwę hosta, port itp.?

+0

Co to znaczy, że chcesz przeanalizować adres URL jdbc. Możesz użyć wyrażenia regularnego. Czy możesz podać przykład: – Ank

+1

jdbc: jtds: sqlserver: // nazwa hosta: port/dbname lub jdbc: jtds: sqlserver: // nazwa hosta: port; databaseName = dbname lub jdbc: oracle: thin: @hostname: port: dbname –

Odpowiedz

35

zacząć od czegoś takiego:

 
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()); 

Wyjście z powyższego:

 
derby 
localhost 
1527 
/netld;collation=TERRITORY_BASED:PRIMARY 
+0

thanks bardzo łatwo mogę uzyskać host, port łatwo w ten sposób, ale muszę przeanalizować ścieżkę, aby uzyskać nazwę bazy danych –

+0

Tak, na pewno. – brettw

+8

nie będzie można parsować _some server_ z jdbc: oracle: thin: @ some.server: 1521: XXX z tym –

6

To nie dla mnie. Wymyśliłem te metody, oparte na założeniu, że nazwa hosta i port są zawsze połączone razem dwukropkiem. To założenie dotyczy wszystkich baz danych, z którymi mam do czynienia w pracy (Oracle, Vertica, MySQL itp.). Ale prawdopodobnie nie działa w przypadku czegoś, co nie dociera do portu sieciowego.

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

Używam tej klasy w moich projektach. Użycie jest naprawdę proste.

/** 
* 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; 
    } 
    } 
} 
Powiązane problemy