2014-12-09 62 views
1

多年來我已經使用JDBC連接到許多不同的關係系統:H2,HSQLDB,MySQL,Oracle,Postgres等。並且在每種情況下,每個系統似乎都有擁有自己的連接字符串語法的味道。JDBC連接字符串語法和解析

我無法想象像JDBC 這樣的長期API不會爲擁有一個用於連接字符串驗證的定義的強制語法。例如:

一些有效的HSQLDB連接字符串:

jdbc:hsqldb:mem:mymemdb 
jdbc:hsqldb:res:org.my.path.resdb 
jdbc:hsqldb:file:/opt/db/testdb 

的MySQL:

jdbc:mysql://localhost/test 

Postgres的:

jdbc:postgresql://localhost/test 

H2:

jdbc:h2:~/test 
jdbc:h2:file:/data/sample 
jdbc:h2:tcp://dbserv:8084/~/sample 

從所有這些例子中,我收集了基本的,普遍語法:

jdbc:<vendor>:<vendor-specific-uri> 

哪裏<vendor>是系統(h2mysql等)的名稱,<vendor-specific-uri>是路徑或者一些特定的供應商確定數據庫位置的方法。

我已經做了大量的挖掘工作,對於我來說,我似乎無法找到JDBC定義有效連接字符串語法的位置。具體來說:

  • 什麼是有效的JDBC連接字符串的一般語法/定義?
  • 連接字符串中每個令牌/組件的不同名稱是什麼?例如,「jdbc:」被稱爲某事物,如「JDBC協議」?我的<vendor><vendor-specific-uri>細分市場的名稱是什麼?

回答

5

的URL語法在JDBC specification指定,特別是在部分9.4:

一個JDBC URL的格式是:

jdbc:<subprotocol>:<subname> 

其中subprotocol定義種數據庫連接機構,其可由一個或多個驅動程序支持。​​的內容和語法將取決於 子協議。

注意 - 並不需要一個JDBC URL完全遵守URI語法在RFC 3986,統一資源標識符(URI)定義:通用語法

有沒有更多的形式來比這個。子協議通常是數據庫或驅動程序的一些標識符。子名稱是自由形式的,儘管驅動程序通常遵循類似URI的語法。

也不需要更多的手續。 DriverManager將簡單地向每個註冊的java.sql.Driver提供URL,並且第一個接受的用於連接。

1

如果您查看源代碼,您將看到JDBC驅動程序實現了java.sql.Driver。這個接口有一個方法

boolean acceptsURL(String url) throws SQLException; 

根據JavaDoc:

檢索驅動程序是否認爲它可以打開到給定URL的連接。通常情況下,驅動程序將返回true,前提是他們瞭解URL中指定的子協議,如果不知道,則返回false

所以你的數據庫的dirver負責實現這個方法。對於H2,這個implementation

@Override 
public boolean acceptsURL(String url) { 
    if (url != null) { 
     if (url.startsWith(Constants.START_URL)) { 
      return true; 
     } else if (url.equals(DEFAULT_URL)) { 
      return DEFAULT_CONNECTION.get() != null; 
     } 
    } 
    return false; 
} 

其他DBMS有不同的實現。

編輯:對於H2,常數Constants.START_URL"jdbc:h2:"。所以即使是領先的jdbc也不是任何形式語法的一部分。

+0

謝謝@Lutz Horn(+1) - 這對我來說實際上有點令人震驚。那麼,基於acceptUrl(...)的JavaDoc,可以肯定的是,JDBC連接字符串的形式語法/解析是:'jdbc:/ ''? – IAmYourFaja 2014-12-09 14:03:59

+0

我編輯了我的答案。 – 2014-12-09 14:13:17

+0

JDBC規範實際上指定'jdbc:',但它並不在'DriverManager'中強制執行。 – 2014-12-09 16:24:56