不同數據庫的JDBC URL格式

1.概述

當我們使用Java處理數據庫時,通常我們使用JDBC連接到數據庫。

JDBC URL是在Java應用程序和數據庫之間建立連接的重要參數。但是,對於不同的數據庫系統,JDBC URL格式可以不同。

在本教程中,我們將仔細研究幾種廣泛使用的數據庫的JDBC URL格式: OracleMySQLMicrosoft SQL ServerPostgreSQL

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格式:

接下來,我們將介紹每種格式。

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看起來很簡單。它具有四個組成部分:

  • protocoljdbc:mysql:
  • hostmysql.db.server:3306
  • databasemy_database
  • propertiesuseSSL=false&serverTimezone=UTC

但是,有時,我們可能會遇到更複雜的情況,例如不同類型的連接或多個MySQL主機,等等。

接下來,我們將仔細研究每個構建基塊。

3.1。協議

除了普通的“ jdbc:mysql: ”協議, connector-java JDBC驅動程序仍然支持某些特殊連接的協議:

當我們談論負載平衡和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
  • databasemy_database
  • 屬性– ssl=true&loglevel=2

六,結論

本文討論了四種廣泛使用的數據庫系統的JDBC URL格式:Oracle,MySQL,Microsoft SQL Server和PostgreSQL。

我們還看到了構建JDBC URL字符串以獲得與這些數據庫的連接的不同示例。