2012-02-15 31 views
22

Làm cách nào để phân tích cú pháp URL JDBC (oracle hoặc sqlserver) để nhận tên máy chủ, cổng và tên cơ sở dữ liệu. Các định dạng của URL khác nhau.Làm cách nào để phân tích url JDBC để nhận tên máy chủ, cổng, v.v ...?

+0

Ý bạn là gì khi muốn phân tích cú pháp url jdbc. Bạn có thể sử dụng regex. Bạn có thể đưa ra một ví dụ – Ank

+1

jdbc: jtds: sqlserver: // tên máy chủ: cổng/dbname hoặc jdbc: jtds: sqlserver: // tên máy chủ: cổng; databaseName = dbname hoặc jdbc: oracle: thin: @hostname: port: dbname –

Trả lời

35

Bắt đầu với một cái gì đó như thế này:

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

Output từ trên:

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

cảm ơn rất nhiều, tôi có thể nhận host, port một cách dễ dàng theo cách này, nhưng tôi phải phân tích đường dẫn để lấy databasename –

+0

Có, bạn chắc chắn sẽ làm. – brettw

+8

bạn sẽ không thể phân tích cú pháp _some server_ ngoài jdbc: oracle: thin: @ some.server: 1521: XXX với điều đó –

6

Đó không làm việc cho tôi. Tôi đã đưa ra các phương pháp này, dựa trên giả định rằng tên máy chủ và cổng luôn được nối với nhau bằng dấu hai chấm. Giả định đó giữ cho tất cả các cơ sở dữ liệu mà tôi phải xử lý tại nơi làm việc (Oracle, Vertica, MySQL, v.v.). Nhưng nó có thể không làm việc cho một cái gì đó mà không tiếp cận với một cổng mạng.

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

Tôi sử dụng lớp này trong các dự án của mình. Việc sử dụng thực sự đơn giản.

/** 
* 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; 
    } 
    } 
} 
Các vấn đề liên quan