日本語PDF

8 データソースおよびURL

この章では、Java Database Connectivity(JDBC)データソースを使用したアプリケーションのデータベースへの接続と、データベースを記述するURLについて説明します。この章の構成は、次のとおりです。

8.1 データソースについて

データソースは、使用するデータベースまたはその他のリソースを指定するための標準汎用オブジェクトです。データソースの概念は、JDBC 2.0 Extension Application Program Interface(API)で導入されました。データソースは、便宜性と移植性のために、Java Naming and Directory Interface(JNDI)の実体にバインドできるため、データベースには論理名でアクセスできます。

データソース機能は、以前のJDBC DriverManager機能の完全な代替機能を提供します。いずれの機能も同じアプリケーションで使用できますが、使用しているアプリケーションはデータソースに移行することをお薦めします。

この項の内容は次のとおりです。

8.1.1 JNDIのOracleデータソース・サポートの概要

JNDI標準は、リモート・サービスおよびリソースを検出してアクセスする方法をアプリケーションに提供します。これらのサービスは、エンタープライズ・サービスにも可能です。ただし、JDBCアプリケーションの場合は、これらのサービスにデータベース接続およびサービスが含まれます。

JNDIを使用すると、アプリケーションはアプリケーション・コードからベンダー固有の構文を削除し、論理名を使用してこれらのサービスにアクセスできます。JNDIには、目的のサービスの特定のソースと論理名を関連付ける機能があります。

すべてのOracle JDBCデータソースは、JNDIによる参照が可能です。開発者が必ずしもこの機能を使用する必要はありませんが、JNDI論理名を使用してデータベースにアクセスすると、コードの移植性が高まります。

ノート:

JNDI機能の使用には、CLASSPATH環境変数にjndi.jarファイルが含まれている必要があります。このファイルは、Java製品とともにインストール・メディアに含まれています。CLASSPATH環境変数に、別個に追加する必要があります。

8.1.2 データソースの機能とプロパティ

JNDIを使用するデータソース機能では、ベンダー固有のJDBCドライバ・クラス名を登録する必要はなく、URLとその他のプロパティの論理名を使用できます。このため、データベース接続をオープンするためのコードは、他の環境に移植できます。

DataSourceインタフェースとOracle実装

JDBCデータソースは、標準javax.sql.DataSourceインタフェースを実装するクラスのインスタンスです。

public interface DataSource
{
   Connection getConnection() throws SQLException;
   Connection getConnection(String username, String password)
      throws SQLException;
   ...
}

Oracleでは、このインタフェースをoracle.jdbc.poolパッケージのOracleDataSourceクラスに実装しています。オーバーロードされたgetConnectionメソッドは、データベースへの接続を戻します。

他の値を使用するには、適切なsetterメソッドを使用してプロパティを設定します。代替のユーザー名とパスワードを設定するには、入力としてこれらのパラメータを取るgetConnectionメソッドを使用することもできます。この設定は、プロパティ設定よりも優先されます。

ノート:

OracleDataSourceクラスとすべてのサブクラスは、java.io.Serializableインタフェースとjavax.naming.Referenceableインタフェースを実装します。

DataSourceのプロパティ

DataSourceインタフェースを実装するすべてのクラスと同様に、OracleDataSourceクラスは、接続するデータベースの指定に使用できる一連のプロパティを提供します。これらのプロパティはJavaBeansのデザインパターンに従います。

次の表に、OracleDataSource標準プロパティおよびOracle拡張機能を示します。

ノート:

Oracleは標準roleNameプロパティを実装していません。

表8-1 標準データソース・プロパティ

名前 説明

databaseName

String

サーバー上の特定のデータベースの名前。

dataSourceName

String

基礎となるデータソース・クラスの名前。接続プーリングの場合、これはプーリングされた基礎となる接続データソース・クラスです。分散トランザクションの場合、これは基礎となるXAデータソース・クラスです。

description

String

データソースの説明。

networkProtocol

String

サーバーとの通信のためのネットワーク・プロトコル。Oracleでは、JDBC Oracle Call Interface(OCI)ドライバにのみ該当し、デフォルトはtcpです。

password

String

接続するユーザーのパスワード。

portNumber

int

サーバーがリクエストをリスニングするポートの番号。

serverName

String

データベース・サーバーの名前。

user

String

ログイン用の名前。

ノート:

セキュリティ上の理由により、getPassword()メソッドはありません。

表8-2 Oracle拡張データソース・プロパティ

名前 説明

connectionCacheName

String

キャッシュの名前を指定します。キャッシュを作成した後は変更できません。

connection­Cache­Properties

java.util.Properties

暗黙的接続キャッシュのプロパティを指定します。

connectionCachingEnabled

Boolean

暗黙的接続キャッシュが使用中かどうかを指定します。

connectionProperties

java.util.Properties

接続プロパティを指定します。

driverType

String

Oracle JDBCドライバのタイプを指定します。ocithinまたはkprbのいずれかを指定します。

fastConnectionFailoverEnabled

Boolean

高速接続フェイルオーバーが使用中かどうかを指定します。

implicitCachingEnabled

Boolean

暗黙的文接続キャッシュが有効かどうかを指定します。

loginTimeout

int

このデータソースがデータベースへの接続の試行中に待機する最大時間(秒)を指定します。

logWriter

java.io.PrintWriter

このデータソースのログ・ライターを指定します。

maxStatements

int

アプリケーションのキャッシュ内に存在する文の最大数を指定します。

serviceName

String

このデータソースに対するデータベース・サービス名を指定します。

tnsEntry

String

TNSエントリ名を指定します。TNSエントリ名は、tnsnames.ora構成ファイルに指定されているTNSエントリに対応します。

OCIドライバでネイティブXA機能を使用する場合は、このOracleXADataSourceプロパティを有効に設定して、Oracleリリース8.1.6以降のデータベースにアクセスしてください。ネイティブXA機能を使用するときにtnsEntryプロパティが設定されていないと、エラー・コードORA-17207のSQLExceptionが発生します。

url

String

データベース接続文字列のURLを指定します。以前のバージョンのOracle Databaseから移行する際の便宜を考えて提供されるものです。Oracle tnsEntryおよびdriverTypeプロパティ、標準portNumbernetworkProtocolserverNameおよびdatabaseNameプロパティのかわりに、このプロパティを使用できます。

nativeXA

Boolean

OCIドライバでネイティブXA機能を使用する場合は、OracleXADataSourceを有効に設定して、Oracleリリース8.1.6以降のデータベースにアクセスしてください。nativeXAプロパティを有効にする場合は、必ずtnsEntryプロパティも設定してください。このプロパティはOracleXADatasource専用です。

このDataSourceプロパティは、デフォルトでfalseに設定されます。

ONSConfiguration

String

FAN/ONSイベントのリモートでのサブスクライブに使用するONS構成を指定します。

ノート:

  • この表では、非推奨となった接続キャッシュをOracleConnectionCacheに基づいてサポートしていたプロパティは省略されています。

  • ネイティブXAは、Java XAよりパフォーマンスが高いため、可能なかぎりネイティブXAを使用してください。

setConnectionPropertiesメソッドを使用して接続のプロパティを設定し、setConnectionCachePropertiesメソッドを使用して接続キャッシュのプロパティを設定します。

サーバー側内部ドライバを使用している場合、つまりdriverTypeプロパティがkprbに設定されている場合、その他のプロパティ設定は無視されます。

JDBC ThinドライバまたはOCIドライバを使用している場合は、次の点に注意してください。

  • URL設定には、次の例のようにuserpasswordの設定が含まれることがあります。この場合は、この設定が個々のuserおよびpasswordプロパティ設定よりも優先されます。

    jdbc:oracle:thin:HR/hr@localhost:5221:orcl
    
  • userpasswordは、URL設定を介して直接設定するか、またはgetConnectionコールを介して設定する必要があります。getConnectionコールによるuserpasswordの設定は、他のプロパティ設定よりも優先されます。

  • urlプロパティを設定した場合は、tnsEntrydriverTypeportNumbernetworkProtocolserverNameおよびdatabaseNameプロパティ設定は無視されます。

  • tnsEntryプロパティを設定した場合(urlプロパティは設定されていないものとします)、databaseNameserverNameportNumberおよびnetworkProtocolの各設定は無視されます。

  • OCIドライバを使用しているときに(driverTypeプロパティはociに設定されているものとします)、networkProtocolipcに設定されている場合、他のプロパティ設定は無視されます。

またgetConnectionCacheName()は、データソースのキャッシュが有効になった後でデータソースのConnectionCacheNameプロパティが設定された場合にのみキャッシュの名前を戻します。

8.1.3 データソース・インスタンスの作成と接続

この項では、JNDI機能を使用せずにデータベースに接続する場合の、データソースの最も基本的な使用例を示します。ベンダーによってはベンダー固有のハードコードされたプロパティ設定が必要であることに注意してください。

次の例のようにOracleDataSourceインスタンスを作成し、必要に応じて接続プロパティを初期化して、接続インスタンスを取得します。

OracleDataSource ods = new OracleDataSource();
ods.setDriverType("oci");
ods.setServerName("localhost");
ods.setNetworkProtocol("tcp");
ods.setDatabaseName(<database_name>);
ods.setPortNumber(5221);
ods.setUser("HR");
ods.setPassword("hr");
Connection conn = ods.getConnection();

または、必要に応じて次のようにユーザー名とパスワードをオーバーライドします。

Connection conn = ods.getConnection("OE", "oe");

8.1.4 データソース・インスタンスの作成、JNDIへの登録および接続

この項では、データソースを使用してデータベースに接続する場合のJNDI機能を示します。ベンダー固有のハードコードされたプロパティ設定は、データソース・インスタンスをJNDI論理名にバインドするコードの部分でのみ必要になります。これ以降は、接続インスタンスを取得するデータソースを作成するために、論理名を使用して、移植可能なコードを作成できます。

ノート:

データソースの作成と登録は、一般にJDBCアプリケーションではなく、JNDI管理者によって処理されます。

データソース・プロパティの初期化

次の例に示すように、OracleDataSourceインスタンスを作成し、必要に応じてそのプロパティを初期化します。

OracleDataSource ods = new OracleDataSource();
ods.setDriverType("oci");
ods.setServerName("localhost");
ods.setNetworkProtocol("tcp");
ods.setDatabaseName("816");
ods.setPortNumber(5221);
ods.setUser("HR");
ods.setPassword("hr");

データソースの登録

前述の例で示したように、OracleDataSourceインスタンスodsの接続プロパティを初期化した後は、次の例に示すように、このデータソース・インスタンスをJNDIに登録できます。

Context ctx = new InitialContext();
ctx.bind("jdbc/sampledb", ods);

JNDI InitialContext()コンストラクタをコールすると、初期JNDIネーミング・コンテキストを参照するJavaオブジェクトが作成されます。表示されていないシステム・プロパティによって、使用するサービス・プロバイダがJNDIに指示されます。

ctx.bindコールは、OracleDataSourceインスタンスを論理JNDI名にバインドします。つまり、ctx.bindをコールした後、いつでも論理名jdbc/sampledbを使用して、OracleDataSourceインスタンスodsのプロパティによって記述されるデータベースへの接続をオープンできます。論理名jdbc/sampledbは、このデータベースに論理的にバインドされます。

JNDIネームスペースの階層構造は、ファイル・システムの階層構造と似ています。この例で、JNDI名はルート・ネーミング・コンテキストでサブコンテキストjdbcを指定し、jdbcサブコンテキスト内で論理名sampledbを指定します。

ContextインスタンスとInitialContextクラスは、標準javax.namingパッケージ内にあります。

ノート:

JDBC 2.0仕様では、すべてのJDBCデータソースを、JNDIネームスペースのjdbcネーミング・サブコンテキスト、またはjdbcサブコンテキストの子サブコンテキストに登録する必要があります。

接続のオープン

lookupを実行して、JNDI名に論理的にバインドされたデータベースへの接続をオープンするには、論理JNDI名を使用します。これを実行するには、lookupの結果(Java Objectも可)をOracleDataSourceにキャストし、そのgetConnectionメソッドを使用して接続をオープンします。

次はその例です。

OracleDataSource odsconn = (OracleDataSource)ctx.lookup("jdbc/sampledb");
Connection conn = odsconn.getConnection();

8.1.5 サポートされている接続プロパティ

Oracle JDBCドライバがサポートする接続プロパティの詳細なリストは、『Oracle Database JDBC Java APIリファレンス』を参照してください。

ノート:

Oracle Databaseで以前の方法でDead Connection Detection (DCD)が有効になっている場合、JDBC Thinドライバ接続プロパティoracle.jdbc.ReadTimeoutおよびJDBCメソッドjava.sql.Connection.setNetworkTimeoutが予想どおりに動作しない場合があります。DCDの新しい実装の詳細は、次のMy Oracle Supportのノートを参照してください: https://support.oracle.com/rs?type=doc&id=1591874.1

8.1.6 SYSログオンのためのロールの使用方法について

SYSでログオンするためのロールを指定するには、internal_logon接続プロパティを使用します。SYSでログオンするには、internal_logon接続プロパティを、SYSDBAまたはSYSOPERに設定します。

ノート:

ロールを指定する機能は、sysユーザー名の場合のみサポートされています。

Bequeathed接続の場合、internal_logonプロパティを設定することにより、SYSとして接続を取得できます。リモート接続の場合、追加でパスワード・ファイルの設定手順を実行する必要があります。

8.1.7 データベース・リモート・ログインの構成

JDBC ThinドライバがSYSDBAとしてデータベースに接続できるようにするには、ユーザーを構成する必要があります。Oracle Databaseのセキュリティ・システムで管理者としてリモート接続するためにはパスワード・ファイルが必要です。次の手順を実行します。

  1. orapwdパスワード・ユーティリティを使用してサーバー側またはリモート・データベースでパスワード・ファイルを設定します。ユーザーSYSのパスワード・ファイルを追加するには、次のようにします。
    • UNIXの場合

      orapwd file=$ORACLE_HOME/dbs/orapwORACLE_SID entries=200
      Enter password: password
      
    • Microsoft Windowsの場合

      orapwd file=%ORACLE_HOME%\database\PWDORACLE_SID.ora entries=200
      Enter password: password
      

    この場合、fileは、パスワード・ファイルの名前です。passwordは、ユーザーSYSのためのパスワードです。SQL Plusでは、ALTER USER文を使用して変更することができます。entriesは、想定されるエントリ数より大きな値に設定してください。

    パスワード・ファイル名の構文は、Microsoft WindowsとUNIXでは異なります。

  2. SYSDBAとしてリモート・ログインを有効にします。このステップでは、SYSDBAおよびSYSOPERシステム権限を個別のユーザーに付与し、それらのユーザーがそのままのユーザーとして接続できるようにします。

    データベースを停止し、次の行を、UNIXの場合はinitservice_name.oraに、Microsoft Windowsの場合はinit.oraに追加します。

    remote_login_passwordfile=exclusive
    

    initservice_name.oraファイルは、ORACLE_HOME/dbs/およびORACLE_HOME/admin/db_name/pfile/に存在します。これらの2つのファイルは同期化してください。

    init.oraファイルは、%ORACLE_BASE%\ADMIN\db_name\pfile\に存在します。

  3. SYSユーザーのパスワードを変更します。これはオプションのステップです。
    PASSWORD sys
           Changing password for sys
    New password: password
    Retype new password: password
    
  4. SYSSYSDBA権限を持っていることを確認します。
    SQL> select * from v$pwfile_users;
    USERNAME                         SYSDB        SYSOP
    ----------------------           ---------    ---------
    SYS                              TRUE         TRUE
    
  5. リモート・データベースを再起動します。

例8-1 リモート接続でのSYSログインの使用

//This example works regardless of language settings of the database.
 /** case of remote connection using sys **/
import java.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.*;
// create an OracleDataSource
OracleDataSource ods = new OracleDataSource();
// set connection properties
java.util.Properties prop = new java.util.Properties();
prop.put("user", "sys");
prop.put("password", "sys");
prop.put("internal_logon", "sysoper");
ods.setConnectionProperties(prop);
// set the url
// the url can use oci driver as well as:
// url = "jdbc:oracle:oci8:@remotehost"; the remotehost is a remote database
String url = "jdbc:oracle:thin:@//localhost:5221/orcl";
ods.setURL(url);
// get the connection
Connection conn = ods.getConnection();
...

8.1.8 Bequeath接続とSYSログオンの使用

次の例は、SYSログインを指定するための、internal_logonおよびSYSDBA引数の使用方法を示しています。この例は、データベースの各国語設定に関係なく動作します。

/** Example of bequeath connection **/
import java.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.*;
 
// create an OracleDataSource instance
OracleDataSource ods = new OracleDataSource();
 
// set neccessary properties
java.util.Properties prop = new java.util.Properties();
prop.put("user", "sys");
prop.put("password", "sys");
prop.put("internal_logon", "sysdba");
ods.setConnectionProperties(prop);
 
// the url for bequeath connection
String url = "jdbc:oracle:oci8:@";
ods.setURL(url);
 
// retrieve the connection
Connection conn = ods.getConnection();
... 

8.1.9 Oracleパフォーマンス拡張機能のプロパティの設定

接続プロパティの一部は、Oracleパフォーマンス拡張機能で使用します。これらのプロパティの設定は、次のようにOracleConnectionオブジェクトで対応するメソッドを使用することと同等です。

次の例は、java.util.Propertiesクラスのputメソッドの使用方法を示します。この例では、Oracleパフォーマンス拡張要素のパラメータを設定する方法を示します。

//import packages and register the driver
import java.sql.*;
import java.math.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;

//specify the properties object
java.util.Properties info = new java.util.Properties();
info.put ("user", "HR");
info.put ("password", "hr");
info.put ("defaultRowPrefetch","20");
info.put ("defaultBatchValue", "5");

//specify the datasource object 
OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:@//localhost:5221/orcl");
ods.setUser("HR");
ods.setPassword("hr");
ods.setConnectionProperties(info);
...

8.1.10 ネットワーク・データ圧縮のサポート

Oracle Database 12cリリース2 (12.2.0.1)以降、JDBC Thinドライバではネットワーク・データ圧縮がサポートされています。ネットワーク・データ圧縮により、データ接続を介して送信されるセッション・データ・ユニット(SDU)のサイズが削減され、ネットワークを介してSQL問合せおよび結果を送信するのに必要な時間が短縮します。ワイヤレス・エリア・ネットワーク(WAN)の場合に、この利点がより重要になります。ネットワーク・データ圧縮を有効にするには、次のように接続プロパティを設定する必要があります。

ノート:

ネットワーク圧縮は、ストリーム処理されたデータでは機能しません。

...
OracleDataSource ds = new OracleDataSource();
Properties prop = new Properties();
prop.setProperty("user","user1");
prop.setProperty("password",<password>);

// Enabling Network Compression
prop.setProperty("oracle.net.networkCompression","on");

//Optional configuration for setting the client compression threshold.
prop.setProperty("oracle.net.networkCompressionThreshold","1024");

ds.setConnectionProperties(prop);
ds.setURL(url);
Connection conn = ds.getConnection();
...

8.2 データベースURLとデータベース指定子

データベースURLは文字列です。完全なURL構文は、次のとおりです。

jdbc:oracle:driver_type:[username/password]@database_specifier

ノート:

  • 大カッコは、username/passwordペアがオプションであることを示します。

  • 内部サーバー側ドライバkprbは、暗黙的な接続を使用します。サーバー側ドライバのデータベースURLはdriver_typeで終わります。

URLの最初の部分には、使用するJDBCドライバを指定します。サポートされているdriver_type値は、thinociおよびkprbです。

URLの残りの部分には、スラッシュで区切られたユーザー名とパスワード(オプション)、@、およびアプリケーションが接続されるデータベースを一意に識別するデータベース指定子が含まれます。データベース指定子には、JDBC Thinドライバにのみ有効なもの、JDBC OCIドライバにのみ有効なもの、両方に有効なものがあります。

8.2.1 インターネット・プロトコル・バージョン6のサポート

Oracle JDBCドライバの今回のリリースでは、インターネット・プロトコル・バージョン6(IPv6)のアドレスを、JDBC URLとIPv6のアドレスに解決するマシン名でサポートします。IPv6は、Internet Engineering Task Force(IETF)で設計された新しいネットワーク層プロトコルで、Internet Protocolの現行バージョンのInternet Protocol Version 4(IPv4)に代わるものです。IPv6の主な利点として、128ビット・アドレスの使用から導出される大容量のアドレス空間があります。IPv6ではまた、ルーティング、ネットワークの自動構成、セキュリティ、サービスの質などの分野でIPv4が改良されています。

ノート:

  • IPv6クライアントはIPv6サーバーのみ、またはデュアル・プロトコル(IPv6とIPv4の両方のプロトコル)をサポートしているサーバーをサポートできます。また、IPv6サーバーはIPv6クライアントのみ、またはデュアル・プロトコル・クライアントをサポートできます。

  • IPv6は単一インスタンス・データベース・サーバーでのみサポートされています。Oracle RACではサポートされていません。

URLでリテラルIPv6アドレスを使用する場合は、リテラル・アドレスを左の大カッコ([)と右の大カッコ(])で囲む必要があります。たとえば、[2001:0db8:7654:3210:FEDC:BA98:7654:3210]のようになります。したがって、IPv6アドレスを使用するJDBC URLは、次のようになります。

  jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)
    (HOST=[2001:0db8:7654:3210:FEDC:BA98:7654:3210])(PORT=5521))
    (CONNECT_DATA=(SERVICE_NAME=sales.example.com))

ノート:

データベースを初期化する際にJavaが有効な場合、IPv6のサポートに必要な新しいシステム・クラスがすべてロードされます。したがって、アプリケーションにIPv6アドレスがない場合は、IPv6機能を使用するために自分のコードを変更する必要はありません。ただし、アプリケーションにIPv6アドレスのみか、IPv6とIPv4アドレスの両方のいずれかがある場合、コマンドラインでjava.net.preferIPv6Addressesシステム・プロパティを設定する必要があります。これにより、Oracle JVMは適切なライブラリをロードできるようになります。これらのライブラリは一度ロードすると、Javaプロセスを再起動しないかぎりリロードできません。

8.2.2 HTTPSプロキシ構成のサポート

Oracle Databaseリリース18cのJDBCドライバは、HTTPSプロキシ構成をサポートしています。HTTPSプロキシを使用すると、HTTP CONNECTメソッドを使用して、フォワードHTTPプロキシ上にセキュアな接続をトンネリングできます。これにより、クライアント側のファイアウォールにアウトバウンド・ポートをオープンする必要がなくなるため、パブリック・クラウド・データベースにアクセスしやすくなります。このパラメータはPROTOCOL=TCPSが指定されている接続記述子に対してのみ適用可能です。これは、インターネットのホストに接続する必要があるイントラネット・ユーザーのWebブラウザ設定に似ています。

HTTPSプロキシを構成するために、次のコード・スニペットに示すように、接続文字列のADDRESS部分に詳細を追加します。

(DESCRIPTION=

  (ADDRESS=(HTTPS_PROXY=sales-proxy)(HTTPS_PROXY_PORT=8080)(PROTOCOL=TCPS)(HOST=sales2-svr)(PORT=443))

  (CONNECT_DATA=(SERVICE_NAME=sales.us.example.com)))

8.2.3 データベース指定子

表8-3は、データベース指定子と各指定子がサポートするJDBCドライバを示しています。

ノート:

  • Oracle Database 10gでは、Oracle Service IDはサポートされません。

  • Oracle Database 10g以降、ネーミング・メソッドとしてのOracle Namesはサポートされなくなりました。

表8-3 サポートされるデータベース指定子

指定子 サポートするドライバ

Oracle Net接続記述子

Thin、OCI

Thinの場合。アドレス・リストを使用します。

url="jdbc:oracle:thin:@(DESCRIPTION=
  (LOAD_BALANCE=on)
(ADDRESS_LIST=
  (ADDRESS=(PROTOCOL=TCP)(HOST=host1) (PORT=5221))
 (ADDRESS=(PROTOCOL=TCP)(HOST=host2)(PORT=5221)))
 (CONNECT_DATA=(SERVICE_NAME=orcl)))"

OCIの場合。クラスタを使用します。

"jdbc:oracle:oci:@(DESCRIPTION=
  (ADDRESS=(PROTOCOL=TCP)(HOST=cluster_alias)
    (PORT=5221))
    (CONNECT_DATA=(SERVICE_NAME=orcl)))" 

Thin形式のサービス名

Thin

詳細は、Thin形式のサービス名の構文を参照してください。

"jdbc:oracle:thin:HR/hr@//localhost:5221/orcl"

LDAP構文

Thin

詳細は、LDAP構文を参照してください。

"jdbc:oracle:thin:@ldap://ldap.example.com:7777/sales,cn=OracleContext,dc=com"

Bequeath接続

OCI

空。つまり、@の後には何も記述しません。

"jdbc:oracle:oci:HR/hr/@"

TNSNames別名

Thin、OCI

詳細は、TNSNames別名の構文を参照してください。

OracleDataSource ods = new OracleDataSource();
ods.setTNSEntryName("MyTNSAlias");

8.2.4 Thin形式のサービス名の構文

Thin形式のサービス名は、JDBC Thinドライバでのみサポートされます。構文は次のとおりです。

@//host_name:port_number/service_name

たとえば:

jdbc:oracle:thin:HR/hr@//localhost:5221/orcl

ノート:

JDBC Thinドライバは、TCP/IPプロトコルのみをサポートします。

8.2.5 Easy Connect Plusのサポート

Oracle Databaseリリース19cのJDBCドライバでは、EasyConnect URLに多くの機能を備えた拡張機能が導入され、この新しい拡張された簡易接続URLは、Easy Connect Plusと呼ばれています。

EasyConnect URLでは、簡略化された接続文字列およびTCP転送プロトコルがサポートされていました。EasyConnect URLへの拡張の目的は、データベースへの接続時にクライアント側のデプロイメントと構成を簡素化することです。この拡張機能により、tnsnames.oraファイルを使用する必要がなくなり、TNS_ADMIN環境変数を指定する必要がなくなります。Easy Connect Plusの主な機能は、次のとおりです。

8.2.5.1 TCPSプロトコルのサポート

EasyConnect URLはTCPトランスポート・プロトコルのみをサポートしていました。ただし、Easy Connect PlusはTCPプロトコルとTCPSプロトコルの両方をサポートしています。この拡張機能により、クライアント構成が、TCPS接続が必須であるOracle Database Cloud Serviceに簡略化されます。

たとえば、EasyConnect URLが次の形式であるとします。

jdbc:oracle:thin:@(DESCRIPTION= 
(ADDRESS=(PROTOCOL=tcps)(HOST=salesserver1)(PORT=1521)) 
(CONNECT_DATA=(SERVICE_NAME=sales.us.example.com)))

この場合、Easy Connect PlusのURLは次のようになります。

jdbc:oracle:thin:@tcps:salesserver1:1521/sales.us.example.com
8.2.5.2 複数のホストとポートのサポート

Easy Connect Plusを使用すると、ホストのカンマ区切りリストを指定できます。

EasyConnect URLでは、単一のホスト名および単一のポートのみが許可されていました。しかし、Easy Connect Plusを使用すると、接続文字列で複数のホストおよび複数のポートを指定でき、ロード・バランシングが有効になっているデータベースに接続する場合にこの接続文字列を使用できます。

たとえば、次のEasyConnect URLを使用して、接続に単一のポート番号を持つ2つのホストを指定するとします。

jdbc:oracle:thin:@(DESCRIPTION= 
(ADDRESS_LIST= (LOAD_BALANCE=ON) (ADDRESS=(PROTOCOL=tcp)(HOST=salesserver1)(PORT=1521)) (ADDRESS=(PROTOCOL=tcp)(HOST=salesserver2)(PORT=1521))) 
(CONNECT_DATA=(SERVICE_NAME=sales.us.example.com)))

この場合、Easy Connect PlusのURLは次のようになります。

jdbc:oracle:thin:@tcp:salesserver1,salesserver2:1521/sales.us.example.com

また、次のEasyConnect URLを使用して、各リストが独自のポート番号に従うリストとして複数のホストを指定するとします。

jdbc:oracle:thin:@(DESCRIPTION= (ADDRESS_LIST= (LOAD_BALANCE=ON) (ADDRESS=(PROTOCOL=tcp)(HOST=salesserver1)(PORT=1521)) (ADDRESS=(PROTOCOL=tcp)(HOST=salesserver2)(PORT=1522)) 
(ADDRESS=(PROTOCOL=tcp)(HOST=salesserver3)(PORT=1522))) 
(CONNECT_DATA=(SERVICE_NAME=sales.us.example.com)))

この場合、Easy Connect PlusのURLは次のようになります。

jdbc:oracle:thin:@tcp:salesserver1:1521,salesserver2,salesserver3:1522/sales.us.example.com
8.2.5.3 接続文字列での接続プロパティの受渡しのサポート

Easy Connect Plusでは、接続URLでの名前/値ペアとしての接続プロパティの指定をサポートしています。?デリミタの後、Easy Connect Plusでは、名前/値ペアとしてのパラメータのリストがサポートされています。これは必要に応じて指定できます。

名前/値ペアを指定する場合は、次の点に注意してください。

  • 疑問符記号(?)を使用して名前/値ペアの始まりを示し、各名前/値ペアの間にアンパサンド記号(&)をデリミタとして使用します。
  • 接続文字列全体を単一の文字列として指定します。
  • 値に特殊文字が含まれている場合は、バックスラッシュ(\)エスケープ文字を使用します。
  • 値の一部として空白が必要な場合は、パラメータ値内の先頭と末尾の空白は無視されるため、空白を二重引用符内に挿入します。

次の表に、サポートされているパラメータの一部を示します。

パラメータ名 古いURLの例 新しいURLの例
wallet_location jdbc:oracle:thin:@(DESCRIPTION= (ADDRESS=(PROTOCOL=tcps)(HOST=salesserver1)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=sales.us.example.com)) jdbc:oracle:thin:@tcps:salesserver1.com:1521/sales.us.example.com?wallet_location=/Users/jsmith/DBCloudService/wallet_JDBCTEST&oracle.net.ssl_server_cert_dn=\"CN=salesserver2.com.com,OU=Oracle BMCS US,O=Oracle Corporation,L=Redwood City,ST=California,C=US\"";
ssl_server_dn_match    
ssl_server_cert_dn jdbc:oracle:thin:@(DESCRIPTION= (ADDRESS=(PROTOCOL=tcps)(HOST=salesserver1)(PORT=1521)) (SECURITY= (SSL_SERVER_DN_MATCH=TRUE) (SSL_SERVER_CERT_DN=cn=sales,cn=OracleContext,dc=us,dc=example,dc=com)) (CONNECT_DATA=(SERVICE_NAME=sales.us.example.com))) jdbc:oracle:thin:@tcps:salesserver1:1521/sales.us.example.com?ssl_server_cert_dn="cn=sales,cn=OracleContext,dc=us,dc=example,dc=com"
https_proxyおよびhttps_proxy_port jdbc:oracle:thin:@(DESCRIPTION= (ADDRESS=(PROTOCOL=tcps)(HOST=salesserver1)(PORT=1521) (https_proxy=www-proxy.mycompany.com)(https_proxy_port=80)) (CONNECT_DATA=(SERVICE_NAME=sales.us.example.com))) jdbc:oracle:thin:@tcps:salesserver1:1521/sales.us.example.com?https_proxy=www-proxy.mycompany.com&https_proxy_port=80
connect_timeout jdbc:oracle:thin:@(DESCRIPTION= (retry_count=3) (connect_timeout=60)(transport_connect_timeout=30) (ADDRESS=(PROTOCOL=tcp)(HOST=salesserver1)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=sales.us.example.com))) jdbc:oracle:thin:@tcps:salesserver1:1521/sales.us.example.com?connect_timeout=60& transport_connect_timeout=30&retry_count=3

DESCRIPTIONの下でサポートされているキーワードのリストは次のとおりです。

  • ENABLE
  • FAILOVER
  • LOAD_BALANCE
  • RECV_BUF_SIZE
  • SEND_BUF_SIZE
  • SDU
  • SOURCE_ROUTE
  • RETRY_COUNT
  • RETRY_DELAY
  • CONNECT_TIMEOUT
  • TRANSPORT_CONNECT_TIMEOUT

ノート:

アプリケーションでSOCKSプロキシを使用してOracle Databaseに接続する場合(Oracle Cloudの要塞など)、TRANSPORT_CONNECT_TIMEOUTパラメータの値は無視されます。

8.2.6 接続の再試行での遅延のサポート

Oracle Database 12cリリース1 (12.1.0.2)以降、秒単位の接続の再試行の遅延を指定する新しい接続属性RETRY_DELAYがあります。次のコード・スニペットは、この属性の使用方法を示しています。

(DESCRIPTION_LIST=
  (DESCRIPTION=
   (CONNECT_TIMEOUT=10)(RETRY_COUNT=3)(RETRY_DELAY=3)
   (ADDRESS_LIST=
    (ADDRESS=(PROTOCOL=tcp)(HOST=myhost1)(PORT=1521))
    (ADDRESS=(PROTOCOL=tcp)(HOST=myhost2)(PORT=1521)))
   (CONNECT_DATA=(SERVICE_NAME=example1.com)))
  (DESCRIPTION=
   (CONNECT_TIMEOUT=60)(RETRY_COUNT=1)(RETRY_DELAY=5)
   (ADDRESS_LIST=
    (ADDRESS=(PROTOCOL=tcp)(HOST=myhost3)(PORT=1521))
    (ADDRESS=(PROTOCOL=tcp)(HOST=myhost4)(PORT=1521)))
   (CONNECT_DATA=(SERVICE_NAME=example2.com))))

8.2.7 TNSNames別名の構文

接続元のクライアント・コンピュータ上のtnsnames.oraファイルにリストされた、利用可能なTNSNAMESエントリを検索できます。Windowsの場合、このファイルはORACLE_HOME\NETWORK\ADMINディレクトリにあります。UNIXシステムの場合は、ORACLE_HOMEディレクトリ、またはTNS_ADMIN環境変数に示されているディレクトリに格納されています。

たとえば、ホストmyhost上のデータベースに、ユーザーHR、パスワードhr(MyHostStringTNSNAMESエントリを持つ)で接続する場合は、次のように記述します。

OracleDataSource ods = new OracleDataSource();
ods.setTNSEntryName("MyTNSAlias");
ods.setUser("HR");
ods.setPassword("hr");
ods.setDriverType("oci");
Connection conn = ods.getConnection();

JDBC Thinドライバがtnsnames.oraファイルの位置を確認できるように、oracle.net.tns_adminシステム・プロパティをtnsnames.oraファイルの位置に設定する必要があります。たとえば:

System.setProperty("oracle.net.tns_admin", "c:\\Temp");
String url = "jdbc:oracle:thin:@tns_entry";

ノート:

TNSNamesをJDBC Thinドライバとともに使用する場合は、oracle.net.tns_adminプロパティをtnsnames.oraファイルのあるディレクトリに設定する必要があります。

java -Doracle.net.tns_admin=$ORACLE_HOME/network/admin

8.2.8 LDAP構文

Lightweight Directory Access Protocol(LDAP)構文を使用するデータベース指定子の例を次に示します。

"jdbc:oracle:thin:@ldap:ldap.example.com:7777/sales,cn=OracleContext,dc=com"

TLSを使用する場合は、これを次のように変更します。

"jdbc:oracle:thin:@ldaps:ldap.example.com:7777/sales,cn=OracleContext,dc=com"

ノート:

JDBC Thinドライバの場合、データベース指定子のldap:ldaps:に置き換えると、LDAPを使用し、TLSを介してOracle Internet Directoryと通信できます。TLSを使用するようにLDAPサーバーを構成する必要があります。そうしない場合は、接続試行がハングします。

JDBC Thinドライバは、サービス名解決プロセスの際、LDAPサーバーのリストのフェイルオーバーをサポートします。ハードウェア・ロード・バランサは必要ありません。また、クライアント側ロード・バランシングが、LDAPサーバーへの接続のためにサポートされます。フェイルオーバーとロード・バランシングをサポートするために、スペースで区切られたLDAP URL構文のリストが使用されます。

LDAP URLのリストを指定すると、フェイルオーバーとロード・バランシングの両方がデフォルトで有効になります。oracle.net.ldap_loadbalance接続プロパティを使用するとロード・バランシングを無効にでき、oracle.net.ldap_failover接続プロパティを使用するとフェイルオーバーを無効にできます。

次の例は、クライアント側ロード・バランシングが無効になっているフェイルオーバーを示しています。

Properties prop = new Properties();
String url = "jdbc:oracle:thin:@ldap:ldap1.example.com:3500/cn=salesdept,cn=OracleContext,dc=com/salesdb" +
"ldap:ldap2.example.com:3500/cn=salesdept,cn=OracleContext,dc=com/salesdb " +
"ldap:ldap3.example.com:3500/cn=salesdept,cn=OracleContext,dc=com/salesdb";

prop.put("oracle.net.ldap_loadbalance", "OFF" );
OracleDataSource ods = new OracleDataSource();
ods.setURL(url);
ods.setConnectionProperties(prop);

JDBC ThinドライバはLDAP非匿名バインドをサポートします。データソースに対して、認証情報を含む一連のJNDI環境プロパティを指定できます。LDAPサーバーが匿名バインドを許可しないよう設定されている場合は、LDAPサーバーに接続するために認証情報を提供する必要があります。次の例は、簡単なクリアテキストのパスワード認証を示しています。

String url = "jdbc:oracle:thin:@ldap:ldap.example.com:7777/sales,cn=salesdept,cn=OracleContext,dc=com";

Properties prop = new Properties();
prop.put("oracle.net.ldap.security.authentication", "simple");
prop.put("oracle.net.ldap.security.principal","cn=salesdept,cn=OracleContext,dc=com");
prop.put("oracle.net.ldap.security.credentials", "mysecret");

OracleDataSource ods = new OracleDataSource();
ods.setURL(url);
ods.setConnectionProperties(prop);

JDBCがJNDIに3つのプロパティを渡すため、クライアントで選択される認証メカニズムが、これらのプロパティのJNDIでの解釈方法と矛盾することはありません。たとえば、クライアントがjava.naming.security.authenticationプロパティを明示的に指定せずに認証情報を指定する場合、デフォルトの認証メカニズムはsimpleです。