不同數據庫的JDBC URL格式
1.概述
當我們使用Java處理數據庫時,通常我們使用JDBC連接到數據庫。
JDBC URL是在Java應用程序和數據庫之間建立連接的重要參數。但是,對於不同的數據庫系統,JDBC URL格式可以不同。
在本教程中,我們將仔細研究幾種廣泛使用的數據庫的JDBC URL格式: Oracle , MySQL , Microsoft SQL Server和PostgreSQL 。
2. Oracle的JDBC URL格式
Oracle數據庫系統廣泛用於企業Java應用程序中。在查看用於連接Oracle數據庫的JDBC URL格式之前,我們首先應確保Oracle Thin數據庫驅動程序在我們的類路徑中。
例如,如果我們的項目由Maven管理,則需要在pom.xml
添加ojdbc14
依賴項:
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4.0</version>
</dependency>
由於某些許可證問題,Maven Central存儲庫僅指向此工件的POM文件。因此,我們需要下載jar並將其手動安裝到我們的Maven存儲庫中。
Thin驅動程序提供了幾種JDBC URL格式:
- 連接到SID
- 連接到Oracle服務名稱
- 帶有
tnsnames.ora
條目的URL
接下來,我們將介紹每種格式。
2.1。連接到Oracle數據庫SID
在某些舊版本的Oracle數據庫中,該數據庫被定義為SID。讓我們看看用於連接到SID的JDBC URL格式:
jdbc:oracle:thin:[<user>/<password>]@<host>[:<port>]:<SID>
例如,假設我們有一個Oracle數據庫服務器主機“ myoracle.db.server:1521
”,並且SID的名稱是“ my_sid
”,我們可以按照上面的格式來構建連接URL並連接到數據庫:
@Test
public void givenOracleSID_thenCreateConnectionObject() {
String oracleJdbcUrl = "jdbc:oracle:thin:@myoracle.db.server:1521:my_sid";
String username = "dbUser";
String password = "1234567";
try (Connection conn = DriverManager.getConnection(oracleJdbcUrl, username, password)) {
assertNotNull(conn);
} catch (SQLException e) {
System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
}
}
2.2。連接到Oracle數據庫服務名稱
通過服務名稱連接Oracle數據庫的JDBC URL格式與我們以前通過SID連接的格式非常相似:
jdbc:oracle:thin:[<user>/<password>]@//<host>[:<port>]/<service>
我們可以連接到Oracle數據庫服務器“ myoracle.db.server:1521
”上的服務“ my_servicename
”:
@Test
public void givenOracleServiceName_thenCreateConnectionObject() {
String oracleJdbcUrl = "jdbc:oracle:thin:@//myoracle.db.server:1521/my_servicename";
...
try (Connection conn = DriverManager.getConnection(oracleJdbcUrl, username, password)) {
assertNotNull(conn);
...
}
...
}
2.3。使用tnsnames.ora
條目連接到Oracle數據庫
我們還可以在JDBC URL中包含tnsnames.ora
條目以連接到Oracle數據庫:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<host>)(PORT=<port>))(CONNECT_DATA=(SERVICE_NAME=<service>)))
讓我們看看如何使用tnsnames.ora
文件中的條目連接到“ my_servicename
”服務:
@Test
public void givenOracleTnsnames_thenCreateConnectionObject() {
String oracleJdbcUrl = "jdbc:oracle:thin:@" +
"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" +
"(HOST=myoracle.db.server)(PORT=1521))" +
"(CONNECT_DATA=(SERVICE_NAME=my_servicename)))";
...
try (Connection conn = DriverManager.getConnection(oracleJdbcUrl, username, password)) {
assertNotNull(conn);
...
}
...
}
3. MySQL的JDBC URL格式
在本節中,我們討論如何編寫JDBC URL以連接到MySQL數據庫。
要從Java應用程序連接到MySQL數據庫,首先讓我們在pom.xml
添加JDBC驅動程序mysql-connector-java
依賴項:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
接下來,讓我們看一下MySQL JDBC驅動程序支持的連接URL的通用格式:
protocol//[hosts][/database][?properties]
讓我們看一個在主機“ mysql.db.server
”上連接到MySQL數據庫“ my_database
”的示例:
@Test
public void givenMysqlDb_thenCreateConnectionObject() {
String jdbcUrl = "jdbc:mysql://mysql.db.server:3306/my_database?useSSL=false&serverTimezone=UTC";
String username = "dbUser";
String password = "1234567";
try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password)) {
assertNotNull(conn);
} catch (SQLException e) {
System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
}
}
上面示例中的JDBC URL看起來很簡單。它具有四個組成部分:
-
protocol
–jdbc:mysql:
-
host
–mysql.db.server:3306
-
database
–my_database
-
properties
–useSSL=false&serverTimezone=UTC
但是,有時,我們可能會遇到更複雜的情況,例如不同類型的連接或多個MySQL主機,等等。
接下來,我們將仔細研究每個構建基塊。
3.1。協議
除了普通的“ jdbc:mysql:
”協議, connector-java
JDBC驅動程序仍然支持某些特殊連接的協議:
- 負載平衡JDBC連接–
jdbc:mysql:loadbalance:
- JDBC複製連接–
jdbc:mysql:replication:
當我們談論負載平衡和JDBC複製時,我們可能會意識到應該有多個MySQL主機。
接下來,讓我們檢查連接URL另一部分的詳細信息hosts
。
3.2 多域名
在上一節中,我們已經看到了定義單個主機的JDBC URL示例,例如mysql.db.server:3306.
但是,如果需要處理多個主機,則可以用逗號分隔的列表列出主機: host1, host2,…,hostN
。
我們也可以用方括號括[host1, host2,…,hostN]
用逗號分隔的主機列表: [host1, host2,…,hostN]
。
讓我們看幾個連接到多個MySQL服務器的JDBC URL示例:
-
jdbc:mysql://myhost1:3306,myhost2:3307/db_name
-
jdbc:mysql://[myhost1:3306,myhost2:3307]/db_name
-
jdbc:mysql:loadbalance://myhost1:3306,myhost2:3307/db_name?user=dbUser&password=1234567&loadBalanceConnectionGroup=group_name&ha.enableJMX=true
如果我們仔細查看上面的最後一個示例,我們將看到在數據庫名稱之後,有一些屬性和用戶憑據的定義。接下來,我們將介紹這些。
3.3。屬性和用戶憑證
有效的全局屬性將應用於所有主機。屬性前面帶有問號“ ?
” ?
”,並寫成key=value
對,並用“ &
”**符號**分隔:
jdbc:mysql://myhost1:3306/db_name?prop1=value1&prop2=value2
我們也可以將用戶憑據放在屬性列表中:
jdbc:mysql://myhost1:3306/db_name?user=root&password=mypass
同樣,我們可以為每個主機添加用戶憑據的前綴,格式為“ user:[email protected]
” :
jdbc:mysql://root:[email protected]:3306/db_name
此外,如果我們的JDBC URL包含主機列表,並且所有主機都使用相同的用戶憑據,則可以在主機列表前添加前綴:
jdbc:mysql://root:mypass[myhost1:3306,myhost2:3307]/db_name
畢竟,也可以在JDBC URL之外提供用戶憑證。
當我們調用方法以獲得連接時DriverManager.getConnection(String url, String user, String password)
可以將用戶名和密碼傳遞給DriverManager.getConnection(String url, String user, String password)
方法。
4. Microsoft SQL Server的JDBC URL格式
Microsoft SQL Server是另一種流行的數據庫系統。要從Java應用程序連接MS SQL Server數據庫,我們需要將mssql-jdbc
依賴項添加到我們的pom.xml
:
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>8.4.1.jre11</version>
</dependency>
接下來,讓我們看看如何構建JDBC URL以獲得與MS SQL Server的連接。
用於連接到MS SQL Server數據庫的JDBC URL的一般格式為:
jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]
讓我們仔細看看格式的每個部分。
-
serverName –
我們將連接到的服務器的地址;這可能是指向服務器的域名或IP地址 -
instanceName –
要在serverName
上連接的實例;這是一個可選字段,如果未指定該字段,則將選擇默認實例 -
portNumber
–這是要在serverName
上連接的端口(默認端口為1433
) -
properties
–可以包含一個或多個可選的連接屬性,必須用分號分隔,並且不允許重複的屬性名稱
現在,假設我們有一個在主機“ mssql.db.server
”上運行的MS SQL Server數據庫,服務器上的instanceName
是“ mssql_instance
”,而我們要連接的數據庫的名稱是“ my_database
”。
讓我們嘗試獲得與此數據庫的連接:
@Test
public void givenMssqlDb_thenCreateConnectionObject() {
String jdbcUrl = "jdbc:sqlserver://mssql.db.server\\mssql_instance;databaseName=my_database";
String username = "dbUser";
String password = "1234567";
try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password)) {
assertNotNull(conn);
} catch (SQLException e) {
System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
}
}
5. PostgreSQL的JDBC URL格式
PostgreSQL是一種流行的開源數據庫系統。要使用PostgreSQL,應該在我們的pom.xml
中將JDBC驅動程序postgresql
添加為依賴項:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.18</version>
</dependency>
連接到PostgreSQL的JDBC URL的一般形式是:
jdbc:postgresql://host:port/database?properties
現在,讓我們研究以上JDBC URL格式的每個部分。
host
參數是數據庫服務器的域名或IP地址。
如果要指定IPv6地址,則host
參數必須用方括號括起來,例如jdbc:postgresql://[::1]:5740/my_database
.mysql
port
參數指定PostgreSQL正在監聽的端口號。 port參數是可選的,默認端口號是5432
。
顧名思義, database
參數定義了我們要連接的數據庫的名稱。
properties
參數可以包含由“ &
”符號分隔的一組key=value
對。
了解了JDBC URL格式的參數後,讓我們看一下如何獲取與PostgreSQL數據庫的連接的示例:
@Test
public void givenPostgreSqlDb_thenCreateConnectionObject() {
String jdbcUrl = "jdbc:postgresql://postgresql.db.server:5430/my_database?ssl=true&loglevel=2";
String username = "dbUser";
String password = "1234567";
try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password)) {
assertNotNull(conn);
} catch (SQLException e) {
System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
}
}
在上面的示例中,我們使用以下命令連接到PostgreSQL數據庫:
-
host:port – postgresql.db.server:5430
-
database
–my_database
- 屬性–
ssl=true&loglevel=2
六,結論
本文討論了四種廣泛使用的數據庫系統的JDBC URL格式:Oracle,MySQL,Microsoft SQL Server和PostgreSQL。
我們還看到了構建JDBC URL字符串以獲得與這些數據庫的連接的不同示例。