1. 概要

Javaでデータベースを操作する場合、通常はJDBCを使用してデータベースに接続します。

JDBC URLは、Javaアプリケーションとデータベース間の接続を確立するための重要なパラメーターです。 ただし、JDBC URL形式は、データベースシステムごとに異なる場合があります。

このチュートリアルでは、広く使用されているいくつかのデータベースのJDBC URL形式を詳しく見ていきます: Oracle MySQL Microsoft SQL Server 、およびPostgreSQL

2. OracleのJDBCURL形式

Oracleデータベースシステムは、エンタープライズJavaアプリケーションで広く使用されています。 Oracleデータベースに接続するためのJDBCURLの形式を確認する前に、まずOracleThinデータベースドライバがクラスパスに含まれていることを確認する必要があります。

たとえば、プロジェクトがMavenによって管理されている場合、pom.xmlojdbc8依存関係を追加する必要があります。

<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>21.1.0.0</version>
</dependency>

Thinドライバーは、いくつかの種類のJDBCURL形式を提供します。

次に、これらの各形式について説明します。

2.1. OracleDatabaseSIDに接続します

一部の古いバージョンのOracleデータベースでは、データベースはSIDとして定義されています。 SIDに接続するためのJDBCURL形式を見てみましょう。

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. OracleDatabaseサービス名に接続します

サービス名を介してOracleデータベースに接続するためのJDBCURLの形式は、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データベースに接続します

tnsnames.oraエントリをJDBCURLに含めて、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のJDBCURL形式

このセクションでは、MySQLデータベースに接続するためのJDBCURLを作成する方法について説明します。

JavaアプリケーションからMySQLデータベースに接続するには、まずpom.xmlにJDBCドライバーmysql-connector-java依存関係を追加します。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.22</version>
</dependency>

次に、MySQLJDBCドライバーでサポートされている接続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());
    }
}

上記の例のJDBCURLは単純に見えます。 4つのビルディングブロックがあります。

  • プロトコル jdbc:mysql:
  • ホスト mysql.db.server:3306
  • データベース my_database
  • プロパティ useSSL = false&serverTimezone = UTC

ただし、場合によっては、さまざまなタイプの接続や複数のMySQLホストなど、より複雑な状況に直面することがあります。

次に、各ビルディングブロックを詳しく見ていきます。

3.1. プロトコル

通常の「jdbc:mysql:」プロトコルを除いて、 connectedor-java JDBCドライバーは、いくつかの特別な接続のプロトコルを引き続きサポートします。

負荷分散とJDBCレプリケーションについて話すとき、複数のMySQLホストが必要であることに気付くかもしれません。

次に、接続URLの別の部分であるhostsの詳細を確認しましょう。

3.2. ホスト

前のセクションで単一のホストを定義するJDBCURLの例を見てきました。たとえば、 mysql.db.server:3306。

ただし、複数のホストを処理する必要がある場合は、ホストをコンマ区切りのリストにリストできます:host1、host2、…、hostN。

カンマで区切られたホストリストを角かっこで囲むこともできます: [host1、host2、…、hostN]

複数のMySQLサーバーに接続するJDBCURLの例をいくつか見てみましょう。

  • 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

結局のところ、 JDBCURLの外部でユーザー資格情報を提供することも可能です。

メソッドを呼び出して接続を取得するときに、ユーザー名とパスワードを DriverManager.getConnection(String url、String user、String password)メソッドに渡すことができます。

4. MicrosoftSQLServerのJDBCURL形式

Microsoft SQL Serverは、もう1つの一般的なデータベースシステムです。 JavaアプリケーションからMSSQLServerデータベースに接続するには、mssql-jdbc依存関係pom.xmlに追加する必要があります。

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>8.4.1.jre11</version>
</dependency>

次に、JDBCURLを構築してMSSQLServerへの接続を取得する方法を見てみましょう。

MSSQLServerデータベースに接続するためのJDBCURLの一般的な形式は次のとおりです。

jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]

フォーマットの各部分を詳しく見てみましょう。

  • serverName –接続するサーバーのアドレス。 これは、サーバーを指すドメイン名またはIPアドレスである可能性があります
  • instanceName – serverNameで接続するインスタンス。 これはオプションのフィールドであり、フィールドが指定されていない場合はデフォルトのインスタンスが選択されます
  • portNumber –これは serverName で接続するポートです(デフォルトのポートは 1433
  • properties – 1つ以上のオプションの接続プロパティを含めることができます。これはセミコロンで区切る必要があり、プロパティ名の重複は許可されていません。

ここで、ホスト「 mssql.db.server」で実行されているMSSQLServerデータベースがあり、サーバー上の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のJDBCURL形式

PostgreSQLは人気のあるオープンソースのデータベースシステムです。 PostgreSQLを使用するには、JDBCドライバーpostgresqlpom.xmlに依存関係として追加する必要があります。

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.18</version>
</dependency>

PostgreSQLに接続するためのJDBCURLの一般的な形式は次のとおりです。

jdbc:postgresql://host:port/database?properties

次に、上記のJDBCURL形式の各部分を調べてみましょう。

host パラメーターは、データベースサーバーのドメイン名またはIPアドレスです。

IPv6アドレスを指定する場合は、 host パラメーターを角かっこで囲む必要があります(例: jdbc:postgresql:// [:: 1]:5740 / my_database )。 mysql

port パラメーターは、PostgreSQLがリッスンしているポート番号を指定します。 portパラメーターはオプションであり、デフォルトのポート番号は5432です。

その名前が示すように、 database パラメーターは、接続するデータベースの名前を定義します。

The プロパティパラメータには、次のグループを含めることができます 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
  • データベース my_database
  • プロパティ – ssl = true&loglevel = 2

6. 結論

この記事では、広く使用されている4つのデータベースシステム(Oracle、MySQL、Microsoft SQL Server、およびPostgreSQL)のJDBCURL形式について説明しました。

また、これらのデータベースへの接続を取得するためにJDBCURL文字列を構築するさまざまな例を見てきました。

いつものように、記事の完全なソースコードは、GitHubから入手できます。