不同數據庫的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字符串以獲得與這些數據庫的連接的不同示例。