Oracle JDBC FAQ

2019年3月11日更新

このドキュメントには、Oracle JDBCドライバに関してよくある質問(FAQ)とその回答が含まれています。このFAQは特定の技術的な質問にのみ回答しており、お客様からよくある質 問と既知のすべての問題に対する解決策を文書化するのに使用されます。詳しくは、JDBC参照ガイドお よびJavadoc for JDBCを参照してください。


トップへ戻る

18.3の新機能

下のセクションでは、18.3のおもなJDBC機能について説明します。より詳細については、Revisiting the Performance & Scalability of Java Applications that use RDBMSesを 参照してください。

  • 新しいJava標準:JDK8, JDK9, JDK10, JDK11およびJDBC 4.2をJDBCドライバ(ojdbc8.jar)およびUniversal Connection Pool(ucp.jar) でサポート
  • データ・タイプ:PL/SQL結合配列のためのアクセシ ビリティ、INバインド変数としてのREF CURSOR、JSONカラム確認API
  • パフォーマンス:traffic directorモードの新しいOracle connection manager、Universal Connection Pool (UCP), 文キャッシング、ネットワーク圧縮、軽量な接続検証など 
  • 高可用性:透過アプリケーション・コンティニュイティ (TAC)、ACとの具体クラスのサポート、DRCPとのAC、FANサポート、およびTransaction Guard (TG)
  • スケーラビリティ:Oracle RACデータ・アフィニティ、シャーディングAPI、マルチテナントおよびシャードされたデータベース用の共有プール、中間層のためのシャード・ルーティ ングAPI、およびラン・タイム・ロード・バランシング (RLB)
  • 接続およびセキュリティ:接続プロパティをセットするためのファイル・サポート (例えば、 ojdbc.properties)、TNS_ADMIN (例えば、接続URL、接続プロパティ、環境変数の一部)をセットするための複数の方法、接続プロパティとしてのサーバー・ドメイン・ネーム (DN)認証のセッティング、OraclePKIProviderのための自動プロバイダ解決、自動キー・ストア・サービス (KSS) 解決、HTTPSプロキシ・サポート、TLSv1.2サポート、Kerberos、Oracle Wallets、およびJKS
トップへ戻る

Java開発者用のドキュメントに関連するOracle Database Cloud Serviceの有無

JDBCドライバやUCPを使用するJava開発者がクラウドのデータベース・サービスに接続する際の詳細な手順は、JDBC with DB Cloudのページに記載されています。

トップへ戻る

JDBCの概要

JDBCとは何ですか。

Java Database Connectivity(JDBC)APIは、Javaプログラミング言語とさまざまなデータベース(SQLデータベース、およびスプレッドシートやフ ラット・ファイルなどその他の表形式データソース)間のデータベースに依存しない接続に使用される業界標準です。JDBC APIでは、SQLベースのデータベース・アクセスに使用するコールレベルのAPIが提供されます。

JDBCテクノロジーではJavaプログラミング言語を使用することにより、企業データにアクセスする必要があるアプリケーションにお いて、"Write Once, Run Anywhere(一度書けば、どこでも動く)"機能を利用します。JDBCテクノロジー対応のドライバを使用することにより、異種環境にある場合でもす べての企業データに接続できます。

- SunのJDBC ページを参照。

トップへ戻る
JDBCの詳細はどこから入手できますか。

最初に参照するのに最適なのは、SunのJDBC ページです。

JDBCに関する文献も多数あります。最初に参照するのに最適なのは、JDBC API Tutorial and Reference, Third Editionです。

特にOracle JDBCドライバについて詳しくは、OTNのSQLJ & JDBCページ、Oracle オンライン・マニュアルJDBC サンプル・コード、および文献(Expert Oracle JDBC Programmingを強く推奨)を参照してください。

トップへ戻る
Javaの詳細はどこから入手できますか。

最初に参照するのに最適なのは、OracleのJava サイトです。

Javaに関する文献も多数あります。代表的な文献は、次のとおりです。

トップへ戻る

リリース固有の質問

どのバージョンのJDBCドライバがサポートされていますか。

サポートされている3つのバージョンのJDBCドライバについては、下の表を参照してください。この表の情報は便宜上の概要であり、詳 細および更新については、ラ イフタイム・サポート・ポリシーの4ページを参照することを推奨します。 

リリース
GA日 Premier Supportの期限
Extended Supportの期限
Sustaining Supportの期限
18.3 TBD TBD TBD TBD
12.2 2017年3月 2022年3月 2025年3月 無期限
12.1 2013年6月 2018年7月 2021年7月 無期限
11.2 2009年9月 2015年1月 2020年12月 無期限

トップへ戻る


さまざまなOracle DBバージョンのクライアント/サーバー相互運用性マトリックスまたは認定マトリックスはどうなっていますか。

サポートされるOracleデータベース・バージョンのJDBCドライバ相互運用性マトリックスについては、この表を参照してください。JDBC ドライバの最新の機能を利用するためのベスト・プラクティスとして、JDBCドライバのバージョンをOracleデータベースのバージョンと同じか、それ 以上にすることを推奨します。

相互運用性マトリックス Database 18.3 Database 12.2および12.1 Database 11.2.0.x
JDBC 18.3
対応
対応
対応
JDBC 12.2および12.1
対応
対応
対応
JDBC 11.2.0.x
対応
対応
対応

トップへ戻る
 


Oracle JDBCのリリースとJDKのバージョンの関連について教えてください。

Oracle JDBCドライバの最新のリリースは、常に最新バージョンのJDKに対応しています。JDBCドライバの一部のバージョンでは、複数のバージョンのJDK をサポートしています。ご希望のJDKバージョンに適したJDBCドライバを選択するには、以下の表を参照してください。
Oracle Databaseのバージョン
リリース固有のJDBC jarファイル
18.3 ojdbc8.jar(JDK 8、JDK 9、JDK 10およびJDK 11)
12.2または12c R2 ojdbc8.jar(JDK 8)
12.1または12c R1 ojdbc7.jar(JDK 7およびJDK 8)
ojdbc6.jar(JDK 6)
11.2または11g R2 ojdbc6.jar(JDK 6、JDK 7、およびJDK 8)
(注:JDK 7とJDK 8は、11.2.0.3と11.2.0.4のみでサポートされます)
ojdbc5.jar(JDK 5)

トップへ戻る
 


Oracle JDBCのリリースとJDBCの仕様の関連について教えてください。

この表には、Oracle JDBCドライバと、そのリリースでサポートされるJDBCの仕様が記載されています。
 
Oracle Databaseのバージョン
JDBC仕様の準拠
18.3 ojdbc8.jarのJDBC 4.2
12.2または12c R2 ojdbc8.jarのJDBC 4.2
12.1または12c R1 ojdbc7.jarのJDBC 4.1
ojdbc6.jarのJDBC 4.0
11.2または11g R2 ojdbc6.jarのJDBC 4.0
ojdbc5.jarのJDBC 3.0

トップへ戻る
 


上の表に記載されていないJDBCバージョンについて教えてください。  

上の表に記載されていないバージョンについては、サポート・チャネルをチェックし、旧バージョンに対するサポート契約がまだ有効である かどうかを確認してください。 

トップへ戻る


JDBC jarファイルはどこから入手できますか。 

必要なJDBC jarファイルは、Oracle Technology NetworkのSQLJ & JDBCダウンロード・ページからダウンロードしてください。

トップへ戻る


ダウンロード・ページにある複数のJARファイルの違いについて教えて ください。 

これらのjarファイルについて詳しくは、下の表を参照してください。

  • ojdbc8-full.tar.gz: 最新の18.3 JDBC Thinドライバ (ojdbc8.jar)、Universal Connection Pool (ucp.jar)、それらのReadme(s)、およびcompanion jarsを含むアーカイブです。
  • ojdbc8.jar:Thinドライバで基本機能をサポートするためのすべてのクラス。一部の機能を使用 するには、追加のjarファイルが必要です。
  • ucp.jar:接続プール機能を備えるUniversal Connection Pool(UCP)。
  • oraclepki.jar、osdt_core.jar、およびosdt_cert.jar:Java からOracleウォレットにアクセスするには、追加のjarが必要です。
  • orai18n.jar:Oracle Notification Service(ONS)デーモンが使用します。
  • simplefan.jar:ONS経由でRACイベントをサブスクライブするためのJava API。
  • xbd6.jar:標準のJDBC 4.x java.sql.SQLXMLインタフェースをサポートするクラス。
  • ojdbc8_g.jarojdbc8.jarと同じ。ただし、デ バッグ情報を含めるために-gオプションを指定してコンパイルし、java.util.loggingコールが含まれる点を除く。
  • ojdbc8dms.jarojdbc8.jarと同じ。ただし、 Oracle Dynamic Monitoring Service(Oracle DMS)をサポートするためのコードが含まれる点を除く。また、JDBCロギング・サポートを含めた場合も除きます。このファイルが使用できるのは、dms.jarも クラスパスにある場合のみです。dms.jarファイルは、RDBMS製品の一部としては付属してい ません。Oracle Application Server製品の一部としてのみ使用できます。
  • ojdbc8dms_g.jarojdbc8dms.jarと同 じ。ただし、デバッグ情報を含めるために-gオプションを指定してコンパイルし、全JDBCロギング・サポートが含まれる点を除く。

 

トップへ戻る


Oracle JDBC jarファイルはすべてのプラットフォームで同一ですか。

はい。実際の.jarファイルはすべてのプラットフォームで同一です。唯一の違いは、OCIクライアントで コールされる.so(または、.dll)ファイルです。.jarファイルは同一であるため、必要に応じてプラットフォーム間で置き換えることができます。

トップへ戻る

Oracle JDBCの概要

オラクルが提供するJDBCドライバとは何ですか。

Oracle では、異なる導入シナリオで使用する場合に対応するために、4種類のJDBCドライバを提供しています。すべてのOracle JDBCドライバは類似していますが、JDBC OCIドライバにのみ該当する機能もあれば、JDBC Thinドライバにのみ該当する機能もあります。 

  • JDBC Thinクライアント側ドライバ: これはJDBC TYPE 4ドライバであり、Javaを使用してOracleに直接接続されます。独自のTCP/IPベースのJavaソケット実装を使用して、Oracle SQL*Net Net8アダプタおよびTTCアダプタが実装されます。JDBC Thinドライバでは、Oracleクライアント・ソフトウェアをインストールする必要はあ りませんが、サーバーをTCP/IPリスナーで構成する必要があります。

    すべてがJavaで記述されているた め、ドライバはプラットフォームに依存しません。JDBC Thinドライバは、Javaアプリケーションの一部として任意のブラウザにダウンロードできます (クライアント・ブラウザ内で実行中の場合、ブラウザを使用してアプレットがサーバーにJavaソケット接続をオープンできるようにする必要がありま す)。

  • JDBC Thinサーバー側ドライバこ れは別のJDBC TYPE 4ドライバであり、Javaを使用してOracleに直接接続されます。このドライバは、Oracleデータベースの内部で使用されます。また、このドラ イバではクライアント側JDBC Thinドライバと同じ機能が提供されますが(上を参照)、Oracleデータベースの内部で実行され、リモート・データ ベースにアクセスするのに使用されます。

    すべてがJavaで記述されているため、ドライバはプラットフォームに依存しません。Thinドライバをクライアント・アプリケーションから 使用する場合と、サーバーの内部から使用する場合のコード間に違いはありません。

  • JDBC OCIクライアント側ドライバ:これはJDBC TYPE 2ドライバであり、Javaネイティブ・メソッドを使用して基本Cライブラリ内でエントリポイントがコールされます。このCライブラリはOCI(Oracle Call Interface)と呼ばれており、Oracleデータベースとやり取りします。JDBC OCIドライバでは、ドライバと同じバージョンのOracleクライアント・インストールが必要です。

    ネ イティブ・メソッドを使用することにより、JDBC OCIドライバ・プラットフォームが固有のものになります。Oracle製品では、Solaris、Windows、その他多数のプラットフォームがサ ポートされています。つまり、Oracle JDBC OCIドライバはCライブラリに依存しているため、Javaアプレットには適していません。

    このJDBC OCIドライバは、OCI Instant Client機能によるインストールに使用できます。この際、完全なOracleクライアント・インストールは必要ありません。 詳しくは、Oracle Call Interfaceを参照してください。

  • JDBCサーバー側内部ドライバ:こ れは別のJDBC TYPE 2ドライバであり、Javaネイティブ・メソッドを使用して基本Cライブラリ内でエントリポイントがコールされます。このCライブラリはOracleサー バー・プロセスの一部であり、コール内の内部SQLエンジンと直接通信するため、ネットワーク・トラフィックの増大が回避されます。これにより、サーバー で実行中のJavaコードは、可能な限りの最高速度で基本データベースにアクセスできます。ただし、使用できるのは同じデータベースへのアクセスの場合の みです。ネイティブ・メソッドを使用することにより、JDBCサーバー側内部ドライバ・プラットフォームが固有のものになります。このサーバー側内部ドラ イバはクライアント側ドライバと完全に一貫性があり、同じ機能と拡張機能がサポートされています。 
トップへ戻る
どのドライバを使用す ればよいですか。

他のドライバを使用する理由がない限り、Thinドライバを使用してください。アプレットを記述する場合は、 Thinドライバを使用する必要があります。

TCP/IP以外のネットワークを使用する場合は、OCIドライバを使用する必要があります。

Oracle サーバー内で作業しており、別のOracleデータベース・サーバーに接続する必要がなく、同じサーバーで2番目のセッションをオープンする必要もない場 合は、サーバー内部ドライバを使用する必要があります。いずれのケースでも、サーバーThinドライバを使用する必要があります。

通常は、Thinドライバを選択するのが最適です。

トップへ戻る
サーバーThinドライバおよびサーバー内部ドライバ用の ファイルについて教えてください。

これらのドライバは両方ともにOracleサーバーJava VMでのみ実行され、VMのインストールの一部としてクラスがインストールされます。これらのドライバに対して必要で使用可能な別のクラス・ファイルは存 在しません。

トップへ戻る
サード・パーティ・ベ ンダーは、Oracle JDBCドライバと自社のソフトウェアを同時に配信できますか。
サード・パーティ・ソフトウェア企業(およびOracleパートナー)の場合は、Oracle 使用許諾契約で規定されているOracleライセンス条件を確認してください。詳しくは、最寄りのオラクル販売代理店 までお問い合わせください。

トップへ戻る
Oracle JDBCドライバが必要とするのはどの権限ですか。

アプリケーションがSecurityManagerを有効にして実行されている場合(本番環境の必要あり)、特定の操作に権限が付与さ れます。この操作を実行するには、コードに適切な権限を付与する必要があります。

通 常は、モデルによって異なります。また、実行を試みている操作に応じて異なります。10.2以降、SecurityManagerが有効な場合に、ドライ バは正しい操作を実行します。この際、権限に関する非常に長いリストが必要になります。セキュアな環境においては必要な権限を付与するだけであるため、付 与する権限はアプリケーションがドライバに対して実行を要求する処理に応じて異なります。

付 与する権限を見つける方法は、demoディレクトリのファイルojdbc.policyに注目することです。これは、ドライバに対して必要な権限をすべて 付与できる、汎用セキュリティ・ポリシー・ファイルです。たいていの場合、アプリケーションではこれらの権限を必要とする機能を使用しないため、多くの権 限をコメント・アウトする必要があります。

このファイルは、多数のSystemプロパティの内容に応じて異なります。このファイルを使用するには、javaコ マンドで-Dオプションを指定してプロパティを定義する必要があります。

JDBCドライバ・コードにのみ付与する必要がある権限もあります。これらの権限が必要な操作は、doPriviligedブ ロックに含まれています。その他の権限は、ドライバをコールするコードにも付与する必要があります。この操作はdoPriviligedブ ロックには含まれていません。できる限りドライバによる障害を引き起こさないようにするために、権限を選択します。注目すべき1つの例は、Thinドライバ を使用して接続をオープンする場合には、コードをコールする際にソケットをオープンする権限が必要であることです。これはいくつかある理由の中でも特に、 不正コードによるDos攻撃にドライバが使用されないようにすることが目的です。

トップへ戻る

インストール

Thinドライバをインストールするにはどうすればよいですか。

jarファイルを使いやすい場所に置き、クラスパスに適切なjarファイルを含めます。ダウンロー ド・ページにある複数のJARファイルの違いについて教えてください。を参照して、必要なファイルを判別します。

トップへ戻る
OCIドライバをインストールするにはどうすればよいです か。

通 常、JDBC OCIドライバでは、ドライバと同じバージョンのOracleクライアント・インストールが必要です。10.1.0以降、このJDBC OCIドライバは、OCI Instant Client機能によるインストールに使用できます。この際、完全なOracleクライアント・インストールは必要ありません。OCI Instant Clientインストールに関するドキュメントを参照してください。

トップへ戻る
サーバー・ドライバにサーバー側内部ドライバまたは Thinドライバをインストールするにはどうすればよいですか。

その必要はありません。これら2つのドライバは、データベース・インストールの一部としてインストールされます。データベースが Javaサポートによりインストールされている場合、これら2つのドライバはすでにインストールされており使用できます。いずれかのクラス・ファイルをOracleサーバーJava VMにロードできますか。を参照してください。

トップへ戻る
現在のプラットフォーム用のファイルはどこから入手できま すか。

Java の"Write Once, Run Anywhere(一度書けば、どこでも動く)"機能に注目してください。jarファイルはすべてのプラットフォームで同一です。OCIドライバ用の共有 ライブラリは、各プラットフォームのOracleクライアント・インストールの一部です。残りのOracleクライアント・インストールを入手すればいつ でも入手できます。Oracle JDBC jarファイルはすべてのプラットフォームで同一ですか。を参照 してください。

10.2の時点では、orai18n.jarはJDBCの一部として提供されなくなっています。現在は、JDBC ダウンロード・ページまたはOracle Globalization Kitの一部として個別に使用できます。また、このファイルはプラットフォームに依存しないため、すべてのプラット フォームで使用できます。

トップへ戻る

DriverManagerおよびDataSource

DriverManagerとDataSourceの違いについて教え てください。

最 初のバージョンのJDBCではConnectionを作成するために、クラスjava.sql.DriverManagerを使用するように指定していま した。この方法では柔軟性が不十分であることが判明したため、以降のバージョンのJDBC仕様では、DataSourceを使用する別の方法を定義して Connectionを作成しています。DataSourceを使用することを推奨します。

JSE 1.5でDriverManagerを使用してConnectionを取得するには、最初に次のようにしてOracleDriverを登録します。

DriverManager.registerDriver(new OracleDriver());

ドライバは一度だけ登録する必要があります。JSE 6では、ドライバを登録する必要はありません。JSE 6には、ドライバを自動的に登録するメカニズムが備えられています。実際に重大な被害を与えることはありませんが、ドライバは登録しないでください。

JSE 1.5ではドライバの登録後、JSE 6では最初の手順の段階で、getConnectionをコールして新しいConnectionを作成します。getConnectionメソッドは、次 の3つです。

getConnection(String url)、getConnection(String url, Properties info)、getConnection(string url, String user, String password)

それぞれで1つのConnectionが返されます。

DataSource には、Connectionを作成するためのさらに柔軟性の高い方法が備えられています。DataSourceがあれば、DataSourceから Connectionを取得することは、DriverManagerを使用した場合と同様に容易です。DataSourceはJNDIとともに使用するよ うに設計されていますが、DataSourceを使用する際にJNDIは必要ありません。DataSourceは、新しいConnectionの作成以外 の処理を実行できます。特に、DataSourceは接続キャッシュを実装できます。現在、DataSourceはConnectionを作成するために 優先される方法です。

DataSourceからConnectionを取得するもっとも簡単な方法は、次のとおりです。

ds = new oracle.jdbc.pool.OracleDataSource(); ds.setURL(myURL); conn = ds.getConnection(user, password);トップへ戻る
OracleConnectionCacheImpl、 Implicit Connection Cache、またはUniversal Connection Pool(UCP)では、いずれの接続キャッシュを使用すればよいですか。

新 しいUniversal Connection Poolを使用する必要があります。この新しい接続キャッシュ・メカニズムは、ドライバ、プロトコル、およびデータベースには依存しません。Oracle 以外のデータベースへの非JDBC接続およびJDBC接続がサポートされています。Oracle JDBCを使用するために、次の高度なOracle機能が用意されています。

  • 接続をストライプ化して再利用するための接続属性
  • 1つ以上の接続キャッシュを管理するための、1つのVMに1つの接続キャッシュ・マネージャ
  • アイドル状態のチェックアウト接続などを再利用するための中止接続タイムアウト
  • パフォーマンスが最高のインスタンスに処理を割り当てるための、ランタイム接続ロードバランシング

Oracle Implicit Connection Cacheのサポートは終了しています。11.1では、古い接続キャッシュOracleConnectionCacheImplのサポートは終了していま す。この質問を参照してください。

トップへ戻る
JDBC OCI接続プーリングとは何ですか。

JDBC OCIConnectionPoolは、データベースへの基本物理接続を備えた複数のステートフル・セッションのプーリングに使用されます。接続は、コー ル期間だけセッションにバインドされます。プール要素は基本物理接続です。アプリケーション・セッションは、使用可能な基本物理接続に移行できます(内部 的)。

プールの各物理接続には、サーバーへの追加内部セッションが含まれています。そのため、サーバーでは多数のセッションが確認できます。

トップへ戻る

接続

データベースへの接続をオープンするにはどうすればよいですか。

ドライバを登録したら(JSE 1.5でのみ必要)、java.sql.DriverManagerクラスの静的getConnectionメ ソッドにより、データベースへの接続をオープンできます。戻り値のタイプはjava.sql.Connectionです。 DataSourceを作成している場合は、getConnectionメソッドをコールすることにより接続を取得できます。

トップへ戻る
getConnectionのさまざま な形式について教えてください。

DriverManagerでは、次の3つの異なる形式のgetConnectionメソッドが 定義されています。

getConnection(String)
必要な接続を記述するのに必要な情報はすべて、URL文字列パラメータにエンコードされます。
getConnection(String, Properties)
一部の情報が、URL文字列パラメータにコード化されます。残りは、プロパティ・パラメータに主要な値ペアとして渡されま す。この形式は、3つのうちもっとも柔軟性が高く強力です。他の方法では設定できないが、この形式では設定できるプロパティも存在します。
getConnection(String, String, String)
これは、ユーザー名とパスワードをURLにエンコードするのではなく、引数として渡す便利なメソッドです。単純なプログラム で頻繁に使用されます。

DataSourceでは、次の2つのgetConnectionメソッドが定義されていま す。

getConnection()
このメソッドでは、DataSourceを作成するために使用されたURL、ユーザー名、およびパスワードにより作成された 接続が返されます。これは、多数のアプリケーションにおいてもっとも一般的に使用される形式のgetConnectionです。
getConnection(String, String)
このメソッドでは、DataSourceを作成するために使用されたURLにより作成された接続が返され ますが、ユーザー名とパスワードはコール元により引数として指定されます。このメソッドを使用する必要があるケースについて理解しておいてください。
トップへ戻る
URLの形式について教えてください。

URLの一般的な形式は、次のとおりです。

jdbc:oracle:<drivertype>:<username/password>@<database>

<drivertype>は、次のうちのいずれかです。

  • thin
  • oci
  • kprb

<username/password>は空にするか、または次の形式にします。

<username>/<password>

このようなURLでは

ユーザー名とパスワードは空として指定されていますが、URL

jdbc:oracle:thin:@mydatabase

では、ユーザー名とパスワードは指定されていません。この形式を使用する際には、ユーザー名とパスワードを他の何らかの方法で指定する 必要があります。

トップへ戻る
<database>記述の形式について教え てください。

<database>記述は、ある程度ドライバ・タイプに左右されます。ドライバ・タイプがkprbの 場合、<database>記述は空にします。ドライバ・タイプがociでBequeath接続を使用する場合、< database>記述は空にします。これに該当しない場合(thinまたはociドライバで、 Bequeath接続ではない場合)、<database>記述は次のいずれかになります。

  • //<host>:<port>/<service>
  • <host>:<port>:<SID>
  • <TNSName>

次のURLを指定すると、ユーザーscottにパスワードtigerを使用して、サービスorclに よりデータベースに接続されます(重要:サービスの詳細を参照)。その際に使用されるポートはホストmyhostの1521 で、Thinドライバが使用されます。

jdbc:oracle:thin:scott/tiger@//myhost:1521/orcl

次のURLを指定すると、同じデータベースにOCIドライバとSID inst1を使用して接続されますが、ユー ザー名とパスワードは指定されていません。

jdbc:oracle:oci:@myhost:1521:inst1

次のURLを指定すると、tnsnames.oraファイルのGLという名前のデータベースにThinドライバを使用 して接続されますが、ユーザー名とパスワードは指定されていません。この場合、ユーザー名とパスワードを他の場所で指定する必要があります。

jdbc:oracle:thin:@GL

リリース10.2.0.1.0では、TNSNAMESエントリとThinドライバを使用する方法が新しくサポートされています。この方法 を実行するには、ファイルtnsnames.oraを正しく構成する必要があります。

トップへ戻る
プロパティの引数はどのように使用すればよいですか。

入力としてURLの他に、標準のJava Propertiesクラスのオブジェクトを使用します。次に例を示し ます。

java.util.Properties info = new java.util.Properties(); info.put ("user", "scott"); info.put ("password","tiger"); info.put ("defaultRowPrefetch","15"); getConnection ("jdbc:oracle:oci:@",info);

サポートされるすべてのプロパティは、oracle.jdbc.OracleConnectionのJavaDoc で定義されています。プロパティ名を定義する定数が存在します。各定数のJavaDocでは、プロパティの実行内容と使用方法が説明されています。

ドライバの11.1以前のバージョンでは、プロパティはoracle.jdbc.pool.OracleDataSource.setConnectionPropertiesのJavaDoc と『Oracle Database JDBC開発者ガイド』で定義されています。

トップへ戻る

クラスOracleDriverDriverManagerに 登録しなくてもよいですか。

サーバー側内部ドライバと接続する際に、OracleDriverクラスを登録する必要はありません。ただし、登録 しても問題はありません。これは、getConnection()またはdefaultConnection()を 使用して接続を確立する場合に当てはまります。

ojdbc6.jarおよびJSE 6以降を使用する場合は、ドライバの種類に関係なくドライバを登録する必要はありません。JSE 6の時点では、標準のJavaサービス・プロバイダ・インタフェースにより自動的にドライバが登録されます。DriverManager.getConnectionを コールすると、ランタイムによりドライバが検出されて登録されます。

トップへ戻る

サーバー内部ドライバに接続する際には、どのユーザー名とパスワードを 使用すればよいですか。

URL文字列で指定したユーザー名とパスワードは、デフォルトのサーバー接続では無視されます。DriverManager.getConnection()メ ソッドをコールするたびに、新しいJava Connectionオブジェクトが返されます。このメソッドでは新しいデータベース接 続は作成されませんが(単一の暗黙的接続のみを使用)、新しいjava.sql.Connectionオブジェクトが返されます。

また、JDBCコードがターゲット・サーバー内部で実行されている場合、接続はクライアントからの明示的接続インスタンスではなく、暗 黙的データ・チャネルとなります。接続はクローズしないでください。

トップへ戻る
デフォルトのプリフェッチ値を大きく設定すると、 OutofMemoryエラーが発生します。どうすればよいですか。

この解決策は、メモリ割当てプールの起動サイズ(-ms)と最大サイズ(-mx)を増やすことです。これにより、11.1以降のドライ バのメモリ使用量が10gドライバの場合よりも減少したため、それほど問題ではなくなりました。この問題に関する詳細な議論に ついては、JDBC OTN Webページのホワイト・ペーパー『JDBC Memory Management』を参照してください。

トップへ戻る
サービス接続文字列とは何ですか。

オ ラクルでは、データベース識別用のSIDメカニズムを新しいサービス手法に置き換えています。この手法は、8.1.7以降のデータベースで使用できます。 JDBCでは、接続URLでのサービスがサポートされています。SIDはデータベースの以降のリリースのいずれかでサポートを終了する予定のため、可能な 限り早い段階でSIDから今回のサービスに移行することを強く推奨します。

サービスURLの基本的な形式は、次のとおりです。

jdbc:oracle:thin:[<user>/<password>]@//<host>[:<port>]/<service> jdbc:oracle:oci:[<user>/<password>]@//<host>[:<port>]/<service>

例:

jdbc:oracle:thin:@//myserver.com/customer_db jdbc:oracle:oci:scott/tiger@//myserver.com:5521/customer_db

詳しくは、『JDBC User Guide』を参照してください。

トップへ戻る
SYSDBAまたはSYSOPERとして接続するにはどう すればよいですか。

こ の処理を実行する唯一の方法は、接続時にユーザー名とパスワードを文字列として指定するのではなく、Propertiesオブジェクトを使用することで す。ユーザー名を"user"プロパティで指定し、パスワードを"password"プロパティで指定します。次に、モードを "internal_logon"プロパティで指定します。つまり、次のように指定します。

Properties props = new Properties(); props.put("user", "scott"); props.put("password", "tiger"); props.put("internal_logon", "sysoper"); Connection conn = DriverManager.getConnection (url, props);

Thinドライバを使用してSYSDBAまたはSYSOPERとして接続する際には、パスワード・ファイルを使用するようにRDBMSを構成する必要がありま す。『Oracle Database管理者ガイド』の"パスワード・ファイルの作成とメンテナンス"を参照してください。

トップへ戻る
Oracle JDBCドライバでは、どのような暗号化方法がサポートされていますか。

JDBC OCIドライバでは、データベース・サーバーと同じアルゴリズムがサポートされています。

11.1と11.2のJDBC Thinドライバでは、次の暗号化がサポートされています。

  • RC4_40
  • RC4_56
  • RC4_128
  • RC4_256
  • DES40C
  • DES56C
  • 3DES112
  • 3DES168
  • SSL
  • AES256
  • AES192
  • AES128
トップへ戻る
JDBC Thinドライバで暗号化とチェックサムを有効にするにはどうすればよいですか。

サーバーは適切に構成されていると仮定して、次のConnectionプロパティを使用します。

Properties props = new Properties(); props.put("oracle.net.encryption_types_client", "(3DES168)"); props.put("oracle.net.encryption_client", "REQUIRED"); props.put("oracle.net.crypto_checksum_types_client", "(MD5)"); props.put("oracle.net.crypto_checksum_client", "REQUIRED");トップへ戻る
プロキシ認証とは何ですか。

プロキシ認証は、あるユーザーが別のユーザー経由で接続する機能です。たとえばプロキシ認証を使用すると、中間層で'汎用'アカウント により一度データベースへの認証が行われてから、実際のユーザーの代わりに軽量セッションが確立されます。oracle.jdbc.OracleConnection.openProxySessionのJavaDoc を参照してください。

トップへ戻る
Oracle JDBCドライバではSSLはサポートされていますか。

はい。ただし、サポートはドライバ固有です。SSL暗号化は、Oracle JDBC 9.2.x以降のJDBC OCIドライバでサポートされており、10.2以降ではThinドライバでサポートされています。

トップへ戻る
Oracle JDBCドライバでは接続URLでLDAPはサポートされていますか。

は い。JDBC Thinドライバでは、たとえば、LDAPプロバイダとしてOracle Internet Directoryを使用する際、接続URLにおいて通常のLDAPとSSLを介したLDAPの両方がサポートされています。詳しくは、『Oracle Database JDBC開発者ガイド』と『Oracle Database Net Services管理者ガイド』を参照してください。

トップへ戻る
JDBCを使用して、ファイアウォールの後方にあるデータ ベース・サーバーに接続するにはどうすればよいですか。

通 常は、Oracle Connection Managerを使用して、ファイアウォール経由で接続をプロキシすることを推奨します。Oracle Connection Managerで使用されるように指定されたポートをオープンし、残りを処理します。データベース・リスナーによって使用されるポート(ポート1521な ど)を直接にはオープンしないでください。

Oracle Connection Managerの構成方法については、『Oracle Database Net Services管理者ガイド』を参照してください。

トップへ戻る

Statement、PreparedStatement、 CallableStatement

defineColumnTypeとはどういうもの で、いつ使用すればよいですか。

defineColumnTypeは、特定のケースでパフォーマンスを向上させるOracle JDBC拡張機能です。以前のバージョンのOracle JDBCでは、すべてのドライバにおいてdefineColumnTypeを コールすることにメリットがありましたが、10.1.0以降ではThinドライバで情報を指定する必要がなくなっています。ThinドライバではdefineColumnTypeを コールしなくても、最高のパフォーマンスが達成されます。OCIドライバおよびサーバー側内部ドライバでは、アプリケーションでdefineColumnTypeが 使用される際に、依然として高いパフォーマンスが達成されます。

コードでThinドライバとOCIドライバの両方が使用されている場合は、Thinドライバを使用する際にConnectionプロパティdisableDefineColumnType"true"に 設定することにより、defineColumnTypeメソッドを無効にできます。これにより、defineColumnTypeがNOOP (操作不可)に設定されます。OCIドライバまたはサーバー側内部ドライバを使用する際には、このConnectionプロパティを設定しないか、または"false"に 設定してください。

列タイプの定義は、データ型を変更するためにも使用されます。または、可変長データのサイズを制限するためにも使用されます。

これには、form_of_useの4番目のパラメータに対する新しい変化形が存在します。

トップへ戻る
defineColumnTypeは サーバーで強制的に変換されますか。

Thinドライバの場合は変換されず、OCIドライバとサーバー側内部ドライバの場合は変換されます。

トップへ戻る

アプリケーション・コードで stmt.setEscapeProcessing(false)をコールするのではなく、JDBCドライバ・レベルでEscapeProcessing を無効にするにはどうすればよいですか。 

OracleConnectionのプロパティ'CONNECTION_PROPERTY_PROCESS_ESCAPES'を使用し てください。 

トップへ戻る


Oracle JDBCドライバでは、名前によるバインド機能は提供されていますか。

はい。oracle.jdbc.OraclePreparedStatementのJavaDocを参照してくださ い。setXXXAtNameメソッドを見つけます。また、oracle.jdbc.OracleCallableStatementで は、正式な引数名によるPL/SQLプロシージャへの引数のバインドがサポートされています。oracle.jdbc.OracleCallableStatement.setXXX(String, ...)メソッドのJavaDocを参照してください。

非常に重要になるのは、setXXX(String, XXX)はコールされたストアド・プロシージャの正式なパラ メータ名を使用してバインドされる点です。一方、setXXXAtname(String, XXX)は、実行されるSQL文字列で Oracleスタイル(:foo)のパラメータ名を使用してバインドされます。これは非常に異なる点で、得られる結果も大幅に異なる場 合があります。

トップへ戻る
Oracle JDBCドライバでは、PreparedStatementのsetXXXメソッドでどのようにしてデータ型が特定されますか。

通常、各setXXXメソッドに関連する固定データ型が存在し、このデータ型は引数の型にもっとも適切に対応しています。

トップへ戻る
ターゲット・パラメータの型がsetXXXメソッドで前提 とした型と同じではない場合、どうなりますか。

データは前提としたデータ型の形式でサーバーに送信され、サーバーではそのデータのターゲット・パラメータ型への変換が試行されます。 変換が実行できない場合、実行時にサーバーによりエラーが通知され、ドライバではSQLExceptionがスローされます。トップへ戻る


ドライバによりクライアント側で変換が実行されないのはな ぜですか。

SQL文の場合は最初にサーバーに移動し、型情報を取得してから変換を実行しますが、追加のラウンドトリップは必要ありません。コード は、JDBCプログラマーが列タイプに最適なAPIを使用するという一般的なケースに対して最適化されます。トッ プへ戻る


バイト・データを表の列に挿入する場合、データ型は何です か。

バ イト・データの場合、次の3つのOracle SQLデータ型があります。それは、RAW、LONG RAW、およびBLOBです。RAWデータは制限された長さで列に直接格納され、サーバーにインライン・パケットの形で送信されます。LONG RAWデータは制限が大幅に拡大されて(2ギガバイト)、特別なメカニズムにより行と並行に格納されており、ストリーミング・コールバック・メカニズムを 介してサーバーに送信されます。BLOBデータは事実上長さに制限がなく、LOBロケータのみが格納されている表から個別に格納され、ロケータが表の列に 格納される前に別の操作としてサーバーに送信されます。

トップへ戻る
文字データを表の列に挿入する場合、データ型は何ですか。

バ イト・データの場合、次の3つのOracle SQLデータ型があります。それは、VARCHAR2、LONG、およびCLOBです。VARCHAR2データは制限された長さで列に直接格納され、サー バーにインライン・パケットの形で送信されます。LONGデータは制限が大幅に拡大されて(2ギガバイト)、特別なメカニズムにより行と並行に格納されて おり、ストリーミング・コールバック・メカニズムを介してサーバーに送信されます。CLOBデータは事実上長さに制限がなく、LOBロケータのみが格納さ れている表から個別に格納され、ロケータが表の列に格納される前に別の操作としてサーバーに送信されます。

トップへ戻る
setString、setCharacterStream、およびsetAsciiStreamのサイズはどれくらいです か。
形式 Stmt ドライバ 下限 上限 バインド・メカニズム
すべて すべて すべて 0 0 Null  
すべて SQL クライアント 1文字 32766文字 直接  
             
すべて SQL クライアント 32767文字 2147483647バイト ストリーム  
すべて SQL クライアント 2147483648バイト 2147483647文字 一時CLOB  
CHAR   サーバー 1文字 65536バイト 直接 1、2
NCHAR     1文字 4000バイト 直接  
NCHAR     4001バイト 2147483647文字 一時CLOB  
CHAR     65537バイト 2147483647バイト ストリーム  
      2147483647バイト 2147483647文字 一時CLOB  
             
すべて PL/SQL すべて 1文字 32512文字 直接  
すべて PL/SQL すべて 32513文字 2147483647文字 一時CLOB  
トップへ戻る
setBytesとsetBinaryStreamを使用 する際のバイナリ・データのサイズ制限はどれくらいですか。
Stmt ドライバ 下限 上限 バインド・メカニズム
SQL クライアント 32767バイト 2147483648バイト ストリーム  
           
すべて すべて 0 0 Null  
SQL すべて 1バイト 2000バイト 直接  
SQL すべて 2000バイト 2147483647バイト ストリーム 1、2
           
PL/SQL すべて 1バイト 32512バイト 直接  
PL/SQL すべて 32513バイト 2147483647バイト 一時BLOB  

注:

  1. サー バー側内部ドライバでは、SQL文のBLOBパラメータに対して2000バイトより大きいデータは変換できません。PL/SQL文では、この制限は存在し ません。このことは、PL/SQLでSQLを折り返すことにより、多くのケースで回避策として使用される場合があります。たとえば、Java文字列insert into blob_tab (blob_col) values (?)

    を次の文字列で置き換えることができます。

    begin Insert into blob_tab (blob_col) values (? ); end;
  2. 代替の回避策として、Oracle固有のメソッドsetBytesForBlobが使用される場合があります。  
トップへ戻る
oracle.jdbc.OraclePreparedStatement における独自のメソッドsetBytesForBlob、setStringForClobのサイズ制限はどれくらいですか。
API 形式 Stmt ドライバ 下限 上限 バインド・メカニズム
setBytesForBlob なし すべて すべて 0 0 Null  
    すべて クライアント 1バイト 2000バイト 直接  
    すべて クライアント 2001バイト 21474836487バイト 一時BLOB 2
               
setStringForClob すべて すべて すべて 0 0 Null  
  すべて すべて クライアント 1文字 32766文字 直接  
  すべて すべて クライアント 32767文字 2147483647文字 一時CLOB  
  すべて すべて サーバー 1文字 4000バイト 直接  
  すべて すべて サーバー 4001バイト 2147483647文字 一時CLOB 1

注:

  1. 代替の回避策として、Oracle固有のメソッドsetStringForClobが使用される場合があります。  
  2. 代替の回避策として、Oracle固有のメソッドsetBytesForBlobが使用される場合があります。  
トップへ戻る
スイッチング・バインドのタイプにより、サーバー側における追加の文解析が強制的に実行されますか。

はい。

トップへ戻る
IN OUTパラメータを指定したCallableStatementと プロシージャについて教えてください。

IN およびOUTパラメータのデータ型を同一にするのが1つの要件です。自動スイッチングを使用する際は、ユーザー・コードの registerOutParameterで型を変更しないと競合が発生します。適切な手法は、この問題を引き起こす可能性のあるIN OUTパラメータを使用しないことです。これを実行するには元のプロシージャを変更し、個別のINおよびOUTパラメータが使用されるラッパー・プロシー ジャまたはPL/SQLブロックを追加します。

トップへ戻る
バインド・タイプを変更すると、多様性を持った PL/SQLプロシージャの選択肢は変更されますか。

はい。このことをPL/SQLコードで利用する可能性について検討してください。

トップへ戻る
既存のコードについて教えてください。

既 存のコードは、引き続き正常に動作します。ただし、変更点が1つあります。以前は、入力のサイズが使用されているAPIの制限値を超えると、setXXX APIのコール時にSQLExceptionがスローされていました。現在では、例外がある場合は実行時に発生します。

トップへ戻る
一部のケースでは、ドライバが一時LOBを作成します。こ の場合、ドライバはこれらのLOBを追跡して解放しますか。

はい。LOBは、文の次回の実行後または文がクローズされたときに解放されます。

トップへ戻る
UTF8のような可変幅のキャラクタ・セットを使用してい ます。ドライバにより、文字列の実際のバイト長は修正されますか。

はい。ただし、最大サイズであると仮定した最長の文字列に対して、CLOBに切り替える場合を除きます。

トップへ戻る
巨大な文字列に対して、たとえばsetStringを使用 するのは適切ですか。

最初の段階で、巨大な文字列を作成するのは適切であるとは言えません。非常に大規模なオブジェクトがJavaメモリ管理システムに与え る影響については、Java仮想マシン・ベンダーのドキュメントを参照してください。

トップへ戻る
LONG RAWおよびLONG列 タイプは非推奨です。この場合、setXXXStream APIを新しく使用するのはなぜですか。

Stream APIは非推奨ではありません。このAPIは、一部の操作においてLOB APIよりも優れたパフォーマンスを達成するため、存続される予定です。

トップへ戻る
LOB APIは非常に柔軟性が高いというのは正しいですか。

もちろんです。LOB APIを使用すると、LOBの任意の部分にランダムにアクセスできます。必要に応じて、このAPIを使用することを検討してください。

トップへ戻る
select * from tab where id in (?, ?, ?, ...)を実行するPreparedStatementを作成できないのはなぜですか。

問題になるのは、RDBMSではIN句の要素に対するバインド・パラメータがサポートされていないことです。これ は、ドライバではなくデータベースに関する制限事項です。

トップへ戻る

ResultSet

"Exhausted ResultSet: prepare_for_new_get"とはどういう意味ですか。

このエラーが発生するのは、ResultSetをクローズした後に使用を試みた場合です。また、ResultSetを作成した文をク ローズした場合にも発生します。

ResultSet rset = stmt.executeQuery ("select ROWID from EMP"); ... rset.close (); // or stmt.close (); rset.getString (1);トップへ戻る
ResultSetをクローズする必要があるのはなぜです か。

元 のJDBC仕様では、Connection、Statement、およびResultSetにアクセスできなくなったときにはクローズする必要がありま す。この場合には、ファイナライザを使用する必要があります。ただしファイナライザを使用すると、すべてのファイナライザが置かれているJVMで実行され ているアプリケーションのすべての側面に関して、パフォーマンスが大幅に低下します。Sunでは、ファイナライザを使用しないことを推奨しています。自動 クローズではファイナライザを使用する必要がありますが、これにより自動クローズを利用しているかどうかに関係なく、すべてのユーザーに対して悪影響を与 えてしまいます。これは許容されるトレードオフではありません。

考えられる 限りにおいては、上の説明に厳密に一致する理由により、ベンダーのJDBCドライバに自動クローズは実装されていませんし、これまで実装されていたことも ありません。この要件は仕様から削除されていますが、何箇所かこの表現が残っている場合があります。JDBCチュートリアルの場合も同様です。このチュー トリアルは参考になり便利ですが、正式なドキュメントではありません。何年間も更新されていません。JDBC 4.0仕様では、自動クローズは一切必要ありません。

ResultSet、 Statemnent、およびConnectionのすべてにおいて、クライアント側とサーバー側の両方のリソースが採用されます。これらのオブジェクト がオープンされている限り、関連するリソースが割り当てられます。このリソースが解放されるのは、オブジェクトがクローズされたときのみです。 ResultSet、Statement、およびConnectionのクローズに失敗するとリソース・リークが発生し、アプリケーションのパフォーマン スに影響が出ます。

Connectionをクローズすると、関連するすべて のStatementがクローズされます。Statementをクローズすると、関連するすべてのResultSetがクローズされます。このため、 Connectionを終了する場合は、ConnectionをクローズするだけですべてのStatementとResultSetがクローズされます。 これは許容できるプログラミング手法です。さらに適切な手法は、最終ブロックでStatementとResultSetを明示的にクローズすることです。 こうすることにより、アプリケーションが要件の変更に適合するように修正された際に堅牢度が増し、リソース・リークが発生する可能性も低くなります。

PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(sql); try { rs = ps.executeQuery(); while (rs.next()) { // process row } } finally { if (rs != null) rs.close(); } } finally { if (ps != null) ps.close(); }トップへ戻る

単純なデータ型

DATEおよびTIMESTAMPの 現在の状況について教えてください。

このセクションでは、単純なデータ型について説明します。

Oracle JDBCドライバの9.2以前では、DATE SQLデータ型がjava.sql.Timestampに マッピングされていました。Oracle DATE SQLデータ型には、java.sql.Timestampの 場合と同様に日付と時刻の両方の情報が含まれているため、この処理にはある一定の意味がありました。java.sql.Dateには時 刻情報が含まれていないため、java.sql.Dateに明確なマッピングを行うことには多少の問題がありました。また、RDBMS ではTIMESTAMP SQLデータ型がサポートされていなかったため、DATETimestampに マッピングすることに関して問題はありませんでした。

9.2では、RDBMSにTIMESTAMPのサポートが追加されました。DATETIMESTAMPの 違いは、TIMESTAMPにはナノ秒が含まれていますが、DATEには含まれていないということです。このため 9.2以降では、DATEDateに、TIMESTAMPTimestampに マッピングされています。ただし、時刻情報を含めるためにDATE値を利用していた場合は、問題が発生します。

9.2以降10.2までのドライバでは、この問題に対処するために次のいくつかの方法が用意されています。

  • 表において、DATEの代わりにTIMESTAMPを使用するよう変更する。これはかな りまれなケースと考えられますが、最適な解決策です。

  • アプリケーションにおいて、defineColumnTypeを使用して列を定義する際に、DATEと してではなくTIMESTAMPとして定義するよう変更する。必要ない限り、実際にdefineColumnTypeを 使用することはないため、この場合には問題が発生します(defineColumnTypeとはど ういうもので、いつ使用すればよいですか。を参照)。

  • アプリケーションにおいて、getObjectの代わりにgetTimestampを使 用するよう変更する。可能な場合、これは適切な解決策です。ただし、多くのアプリケーションにはgetObjectを利用する汎用コー ドが含まれているため、必ずしも使用できるとは限りません。

  • ConnectionプロパティV8Compatibleを 設定する。この設定によりJDBCドライバに対して、新しいマッピングではなく古いマッピングを使用するよう指示されます。このフラグは、 ConnectionプロパティまたはSystemプロパティのいずれかとして設定できます。Connectionプロパティを設定するには、DriverManager.getConnectionま たはOracleDataSource.setConnectionPropertiesに渡されるjava.util.Propertiesオ ブジェクトにConnectionプロパティを追加します。Systemプロパティを設定するには、javaコマンドラインで-Dオ プションを指定します。

    java -Doracle.jdbc.V8Compatible="true" MyApp

Oracle JDBC 11.1では、この問題は修正されています。このリリース以降のドライバでは、デフォルトでSQL DATE列がjava.sql.Timestampにマッピングされています。正しいマッピングを取得するために、V8Compatibleを 設定する必要はありません。V8Compatibleは非推奨です。一切使用しないでください。trueに設定しても問題はありません が、使用しないことを推奨します。

V8Compatibleは まれに使用されていたこともありますが、DATEからDateへの変更に関する問題を修正するためではなく、8iデータベースとの互換性をサポートするた めに存在していました。8i(およびそれ以前の)データベースでは、TIMESTAMP型はサポートされていませんでした。V8Compatibleを 設定すると、データベースからの読取り時にSQL DATEがTimestampにマッピングされるだけでなく、データベースへの書込 み時にTimestampがSQL DATEに変換されてしまいます。8iのサポートは終了しているため、11.1 JDBCドライバではこの互換性モードはサポートされていません。このため、V8Compatibleのサポートは終了しています。

上で説明したように、11.1ドライバではデフォルトで、データベースからの読取り時にSQL DATEがTimestampに 変換されます。これは常に正しい処理でしたが、9iでの変更時に誤りが発生していました。11.1ドライバでは正しい動作に戻されています。アプリケー ションでV8Compatibleを設定していない場合でも、たいていの場合動作に違いはありません。getObjectを使用して DATE列を読み取る際に、違いに気付く可能性があります。結果は、DateではなくTimestampになりま す。TimestampDateのサブクラスであるため、通常この点は問題にはなりません。違いに気付く可能性が あるのは、DATEからDateへの変換を利用して時刻部分を切り捨てる場合か、または値に対してtoStringを実行する場合で す。これらの処理を実行しない場合、変更は透過的になるはずです。

何らかの理由により、この変更に対してアプリケーションが大きな影響を受け、9i以降10gまでの動作を指定する必要がある場合、設定 可能なConnectionプロパティが存在します。mapDateToTimestampをfalseに設定すると、ドライバの動作 がデフォルトの9i以降10gまでの動作に戻され、DATEがDateにマッピングされます。

トップへ戻る
バインドできる最長の値は何ですか。
メソッド 列タイプ 最大長
setBytes LONG 4000バイト
setBytes LONG RAW 2ギガバイト
setString LONG 32000文字(SetBigStringTryClob="false"
4000文字(SetBigStringTryClob="true"
setString CLOB 20億文字

9.2 では、LONGのsetString()により、OCIドライバでは最大64000文字、Thinドライバでは最大4000文字を挿入できます。 10.1.0では、両方のドライバの制限値が32000文字に変更されています。OCIの制限値を64000から32000に減少させたことにより、一部 のお客様で問題が発生する可能性があることは認識しています。ただし、この変更により達成可能な大幅なパフォーマンス向上について検討し、アーキテクチャ の変更が必要であると判断した結果、オラクルではお客様に対してLONGからCLOBに移行することを強く推奨します。

32000を超える文字を処理するためにsetString()が必要になるお客様に対して、LONGからCLOBに移行することを推 奨します。

トップへ戻る
TIMESTAMP WITH TIME ZONEの読取り結果が異なるのはなぜですか。

以前の動作は正しくありませんでした。バグ4322830を参照してください。

以前の動作は、データベース値と同じ値を出力するTimestampを構成することでした。しかし、Timestampの タイムゾーンがUTCであるため、正しい値からオフセット量のあるTimestamp値が出力されていました。UTCにおける2007 年1月1日午前8時は、PSTにおける2007年1月1日午前8時と同じではありません。これらは、別の時刻ポイントを表しています。

データベースでの読取り時刻がPSTにおける2007年1月1日午前8時の場合、9iおよび10gドライバではUTCにおける2007 年1月1日午前8時という値でTimestampが構成されています。この値は、"2007年1月1日午前8時"と"正しく"出力され ていますが、明らかに誤った時刻ポイントを表しています。11.1ドライバではこのバグは修正されています。

トップへ戻る



高度なデータ型(オブジェクト)

ADTのインスタンスはどのようにして作成すればよいですか。

JDBC 4.0では、ADTインスタンスの作成用としてConnectionイ ンタフェースに関するファクトリ・メソッドが導入されました。このメソッドはコンストラクタを使用する場合と比較して、非常に適したAPIです。可能な限 り、ファクトリ・メソッドを使用することを強く推奨します。コンストラクタの使用はできるだけ早い時期に非推奨にし、可能な限り早急にサポートを終了する 予定です。

標準のファクトリ・メソッドが導入されたのはJDBC 4.0であるため、このメソッドが使用できるのはJSE 6ドライバ(ojdbc6.jar)のみです。オラクル独自の型を作成するために、JSE 5とJSE 6(ojdbc5.jarとojdbc6.jar)の両方に対してOracleConnectionでファクトリ・メソッ ドが定義されています。もう一度繰り返しますが、ファクトリ・メソッドを使用することを強く推奨します。

トップへ戻る



標準のファクトリ・メソッドcreateArrayOfが サポートされていないのはなぜですか。

SQL 標準の配列型はanonymous(匿名)で、これは"array of foo(foo配列)"型には名前がないという意味です。名前が付けられているのは、要素型のみです。Oracle SQLでは、配列型に名前が付けられています。実際、匿名の配列型はサポートされていません。このため、JDBC 4.0の標準のファクトリ・メソッドでは引数として要素型を取得し、匿名配列型のインスタンスが作成されます。Oracle JDBCドライバでは、オラクル独自のメソッドcreateArrayが定義されています。このメソッドでは配列型の名前が取得され、 その名前の付いた配列型のインスタンスが返されます。この処理は、Oracle SQLが定義される方法で必要になります。現時点では、Oracle DatabaseにおいてJDBC 4.0の標準createArrayOfメソッドをサポートすることはできません。

トップへ戻る



BFILE、BLOB、CLOB

DBMS_LOB.ERASEが実行する処理は何ですか。

CLOBのセグメントを"消去"するだけです。CLOBの長さを短くは*しません*。このため、CLOBの長さは消去の前後で同じで す。CLOBの長さを短くするには、DBMS_LOB.TRIMを使用します。

トップへ戻る



oracle.sql.CLOB.putChars()は使用できます か。

はい。使用できますが、位置と長さの引数が正しいことを確認する必要があります。また、推奨のOutputStreamインタフェース を使用して、次にputCharsをコールすることもできます。

トップへ戻る
OCIはCLOB CharSetIdを操作する機能を備えています。JDBCと同等なものは何ですか。

JDBCではCLOBは*常に*USC2に置かれていますが、これはJava "char"型に対応するOracleキャラクタ・セットです。このため、OCI CLOB CharSetIdに同等なものは存在しません。

トップへ戻る
BLOBへの書込みはLONG RAWの挿入より遅いですか。

モデルによって異なります。10000よりも小さい値を書き込む場合は、LONG RAWの方が高速です。大きい値を書き込む場合は、違いがなくなります。

トップへ戻る
Streamサンプル・コードでLobLengthを取得 した際に、ORA-03127エラーが表示されるのはなぜですか。

これが正しい動作です。LONG列はインプレース(別名インロー)では'フェッチ'されません。この列はアウトオブプレースでフェッチ され、明示的に読み取るまでパイプ内に置かれます。この場合はLobLocatorを取得(getBlob())し、LONG列を読み取るに このLOBの長さの取得を試みます。パイプは空でないため、上の例外が発生します。解決策は、BLOBで何らかの操作を実行する前に、LONG列の読取り を完了することです。

トップへ戻る
データベースからCLOBを取得して更新した際、データ ベースに変更内容が表示されないことがあります。なぜですか。

Oracle LOBでは、値セマンティクスが使用されています。LOBを更新する際には、LOBをデータベースに書き戻して変更内容を確認する必要があります。技術的 な理由により、LOBを書き込んでいないときでも変更内容が保存される場合があります。ただし、この現象がいつ発生するのかは予測できないため、必ず LOBを書き込む必要があります。

トップへ戻る

REF型

2つの異なるJDBCクライアント(EJB、JDBCクライアントな ど)間でoracle.sql.REFを渡すには、どうすればよいですか。この際、REFクラスはシリアライズ可能ではないのですか。

以前は可能でしたが、その後可能ではなくなりました。現在、REFはシリアライズ可能です。

REFがシリアライズ可能ではない、旧バージョンのOracle JDBCドライバを使用している場合、次の注意事項がまだ有効である可能性があります。

REF クラスの重要な構成要素はバイト配列であり、この配列はオブジェクト参照およびオブジェクト・タイプの完全修飾名を表しています。次の"SomeREF" クラスのような1つのクラスを使用して、オブジェクトREFのバイト数とタイプ名を保持できます。このクラスはシリアライズ可能です。また、パラメータと してJDBC Connectionを必要とする"toREF"メソッドで、REFを再作成できます。

public class SomeREF implements java.io.Serializable { String typeName; byte[] bytes; public SomeREF (oracle.sql.REF ref) throws SQLException { this.typeName = ref.getBaseTypeName (); this.bytes = ref.getBytes (); } public oracle.sql.REF toREF (Connection conn) throws SQLException { return new oracle.sql.REF (new oracle.sql.StructDescriptor (typeName,conn),conn, bytes); } }トップへ戻る
新しいREFを作成するにはどうすればよいですか。

Oracle8 オブジェクト・タイプへのREFを含む表に対して問合せを実行できます。また、このREFはJDBCにより、Java oracle.sql.REFオブジェクトとしてマテリアライズされます。JDBCでは、新しいREFを最初から作成することはできません。データベース に移動して、新しいREFをSQLに挿入する必要があります。その後、REFを選択してクライアントに返す必要があります。

この処理は、PL/SQLブロックで実行するのが簡単です。たとえば、次の表がある場合です。

create or replace type point as object (x number, y number); create table point_values_table of point; create table point_ref_table (p ref point);新しいポイント値をpoint_values_tableに挿入してから新しいrefをpoint_ref_tableに挿入し、次のコー ドによりクライアントにREFを返します。oracle.jdbc.driver.OracleCallableStatement call = (oracle.jdbc.driver.OracleCallableStatement) conn.prepareCall ("declare x ref point; " + "begin insert into point_values_table p values (point(10, 20))" + " returning ref(p) into x; " + " ? := x; " + "end;"); call.registerOutParameter (1, oracle.jdbc.driver.OracleTypes.REF,"SCOTT.POINT"); call.execute (); oracle.sql.REF ref = (oracle.sql.REF)call.getObject (1);トップへ戻る

OPAQUE型

OPAQUE型とは何ですか。

OPAQUE型にはバイナリ・データと、サーバー・ネイティブ・コード・ライブラリで定義されるサポート・メソッドが含まれています。 これらは、オラクル社内でのみ使用可能です。トップへ戻る


RowSource

実行後にスクロール可能性属性を設定しましたが、RowSetのスク ロール可能性に反映されません。なぜですか。

Beanのプロパティは、次のように分類できます。

  • オブジェクト作成プロパティ
  • ランタイム・プロパティ
オブジェクト作成プロパティはオブジェクトの作成前に設定する必要がある、オブジェクト作成に関する主要なプロパティです。ランタイム・プロ パティは常時設定することができ、実行時にBeanの動作を変更するためのプロパティです。

ス クロール可能性、ユーザー名、パスワードはすべて、オブジェクト作成プロパティです。自動コミット、ステータス、プリフェッチ・カウントなどはすべて、ラ ンタイム・プロパティです。通常、バックグラウンド・オブジェクトはexecute/setCommand時に有効になるため、すべての文作成属性はその 前に設定する必要があります。このため、Statement URL、ユーザー名、パスワードなどを作成するには接続オブジェクトが必要であり、コマンドを設定する前に設定する必要があります。

トップへ戻る
Rowsetにストリームが含まれている場合でも、 Rowsetオブジェクトをフラット・ファイルにシリアライズできますか。

は い。シリアライズ可能なストリームを使用することにより、フラット・ファイルやネットワーク接続などのシリアライズ可能メディアのストリーム・オブジェク トをシリアライズできます。この機能はCachedRowSetにのみ適用されます。JDBCドライバが存在する1台のマシン上で CachedRowSetを作成し、ドライバ・バイナリではなくRowSetバイナリのみが存在するリモート・クライアントに対して、その CachedRowSetを移動することが可能です。リモート・クライアントは、RowSetを挿入、削除、または更新することにより変更できます。次 に、そのCachedRowSetをJDBCドライバとRowSetバイナリが存在する場所に戻し、変更した値をデータベースに同期させます。

トップへ戻る

Thinドライバ

Javaアプリケーションの開発にThin JDBCドライバは使用できますか。

は い。JavaアプレットとJavaアプリケーションの両方の開発にThin JDBCドライバが使用できます。Thinドライバは完全にJavaで記述されている ため、ダウンロードしてJavaアプレットで使用できます。また、Javaアプリケーションでも使用できますが、TCP/IPを使用している場合のみで す。ThinドライバはJDBC OCIドライバとは異なり、TCP/IPベースのネットワークでのみ動作します。TCP/IP以外のネットワークでアプリケーションを実行しているユー ザーに対しては、JDBC OCIドライバを使用することを推奨します。

 

トップへ戻る

サーバー内部ドライバ

サーバー内部ドライバはいつ使用すればよいですか。

サー バー内部ドライバは、Javaストアド・プロシージャ内のデータベースにアクセスする際に使用します。Javaストアド・プロシージャは、PL/SQLが RDBMSで実行されるのと同様に、Oracle RDBMSの内部で実行されるJavaメソッドです。これはRDBMSで実行されるため、データベース・セッションで実行する必要があります。サーバー内 部ドライバ接続は、そのデータベース・セッションへのハンドルです。このため、コードがJavaストアド・プロシージャで実行されており、データベースに アクセスする必要がある場合は、サーバー内部ドライバを使用します。ただし、サーバーThinドライバを使用する必 要があるようなまれなケースは除きます。

トップへ戻る

サーバーThinドライバ

サーバーThinドライバはいつ使用すればよいですか。

通 常、サーバー内部ドライバはJavaストアド・プロシージャで使用します。このドライバは、ストアド・プロシージャが実行されているのと同じセッションに 接続されます。ただし、場合によっては、別のデータベースまたは同じデータベース内の新しいセッションに接続する必要が生じます。これら2つのケースで は、サーバーThinドライバを使用する必要があります。

トップへ戻る

Errors

DriverManager.getConnectionがエラー: "No suitable driver"を出します。

ドライバが登録されていること、およびJDBCドライバと一致する接続URLを使用していることを確認してください。正しい値については、Using Oracle's JDBC Driversを参照してください。

トップへ戻る

エラー・メッセージ: "UnsatisfiedLinkError with OCI driver"

Windows NTまたはWindows 95を使用している場合、OCI73JDBC.DLLによって呼び出されたDLLの1つをロードできないと、Java仮想マシンは OCI73JDBC.DLLをロードできないと警告されます。JDBC OCIドライバは、ドライバのCコード部分を含む共有ライブラリを使用します。このライブラリは、Oracle7クライアント・プログラム用の OCI73JDBC.DLLです。共有ライブラリは通常、ディストリビューションからJDBCドライバをインストールするときに [ORACLE_HOME]\BINにインストールされます。そのディレクトリがPATHにあることを確認してください。詳細については、ドキュメントの インストール・セクションをご覧ください。

共有ライブラリは他のライブラリにも依存します。これらのDLLのいずれかが存在しない場合は、OCI73JDBC.DLLが存在しな いというエラーが表示されます。JDBC OCI7には、次のOracle7ファイルが必要です。: CORE35.DLL, CORE35O.DLL, NLSRTL32.DLL, and ORA73.DLL

Java仮想マシン (JavaSoft JDK)はJAVAI.DLLです。

Microsoft Visual C++ランタイムは、MSVCRT.DLL、MSVCRTI.DLL、MSVCRT20.DLL、およびMSVCRT40.DLLです。

依存しているDLLのリストを見つけるには、Windowsエクスプローラ・プログラムでDLLを右クリックし、クイック・ビューを選 択します。クイック・ビュー画面には、依存DLLを一覧表示したインポート・テーブルが表示されます。OracleインストレーションCDから、欠落して いる必要なサポート・ファイルを再インストールできます。"Required Support Files 7.3.4"、"SQL*Net Client 2.3.4 "、および"Oracle TCP/IP Protocol Adapter 2.3.4"をインストールしてください。

トップに戻る
エラー・メッセージ: "ORA-1019: unable to allocate memory."

Oracle7クライアント・インストレーションでOCI8ドライバを使用しています。OCI7ドライバを使用してください。

トップに戻る
エラー・メッセージ: "ORA-01000: maximum open cursors exceeded"

1つのクライアントが接続上で同時に開くことができるカーソルの数は制限されています。(50がデフォルト値です。) カーソルをクローズして解放するには、メソッド stmt.close() を使用して、文を明示的に閉じる必要があります。

これらのカーソルを明示的に閉じないと、結局このエラーになります。単に "OPEN_CURSORS" 制限を増やすと、しばらく問題を回避するのに役立ちますが、それは問題を隠し、解決することにはなりません。不要になったカーソルを明示的に閉じるのはあ なたの責任です。

トップに戻る
エラー・メッセージ: "ORA-01002: fetch out of sequence"

JDBC接続では、デフォルトでAutoCommitがONになっています。ただし、'for update'のSQLを使用するには、autoCommitをOFFにする必要があります。

従って、解決策はautocommitをfalseに設定することです。

トップに戻る
エラー・メッセージ: "ORA-12705: invalid or unknown NLS parameter value specified"

NLS_LANGを明示的に設定してみてください。NLS_LANGが設定されていないか正しく設定されている場合は、Oracle7.3.4以外のクライアントがある可能性があります。クライアントにOracle7.3.4をインストールします。

トップに戻る
Error ORA-12705のテキストを取得しようとしている時のエラー

クライアントにOracleがインストールされていないか、インストールが正しく完了しませんでした。まだ実行していない場合は、通常 のOracle ServerインストールCDを使用して"Oracle Client"インストレーションを実行し、必要なソフトウェアをクライアント・マシンにインストールします。すでに行なっている場合は、インストールが 実際に正しく完了したことを確認し、必要に応じて削除して再インストールします。

このエラーは、クライアントのインストールを実行してからORACLE_HOMEの設定を忘れると発生することがあります。 ORACLE_HOME環境変数がない場合は、クライアント側を再インストールしなくても、その環境変数を設定またはエクスポートするだけで問題が解決す るはずです。

トップに戻る
エラー・メッセージ: The JDBC Thin Driver Gives Me "invalid character" Errors for Unicode Literals

JDBC Thinドライバでは、Unicodeを含むリテラルを二重引用符で囲む必要があります。例えば:

ResultSet rset = stmt.executeQuery ("select * from \"\u6d82\u6d85\u6886\u5384\"");トップに戻る
INSERT、UPDATE操作が遅いです。

デフォルトでは、文を実行すると同時にドライバはすべてのINSERTとUPDATEをコミットします。これはJDBCでは autoCommitモードとして知られています。autoCommitをオフにして明示的なcommit文を使用すると、パフォーマンスが向上します。 autoCommitを無効にするには、ConnectionクラスのsetAutoCommitエントリポイントを使用します。:

connection.setAutoCommit(false); INSERTおよびUPDATEの呼び出しをバッチ処理するためのOracle拡張機能については、JDBCドキュメントの「更新のバッチ処理」を参照し てください。これらのコマンドをバッチ処理すると、autoCommitをオフにするよりもさらに高速になります。トップに戻る
エラー・メッセージ: "Connection reset by peer"

通常、これは、接続中にサーバーがクラッシュした場合に表示されるエラーです。接続を確立していると中華、確立された接続の途中にいる 可能性があります。どちらの方法でも、サーバー側のログ・ファイルを確認して、サーバーで発生したエラーとスタック・ダンプを確認する必要があります。

このエラーは、間違った/無効なポートやマシンに接続しようとした場合とは異なることに注意してください。このエラーではなく、別のエラーが発生します。サーバーがダウンしていて接続要求を受け付けていない場合に発生するエラーとは異なります。

トップに戻る

Protocol Violation"とはどういう意味ですか?

Thinドライバは、RDBMSから予期しないものを読み取ったときにこの例外をスローします。これは、Thinドライバのプロトコ ル・エンジンとRDBMSのプロトコル・エンジンが同期していないことを意味します。このエラーから回復する方法はありません。接続が切れています。それ を閉じることを試みるべきですが、それもおそらく失敗するでしょう。

このエラーを生成する再現可能なテスト・ケースを入手した場合は、Oracle Global SupportにTARを提出してください。JDBCドライバとRDBMSの正確なバージョン番号を、パッチも含めて必ず指定してください。

トップに戻る

デモ・プログラム

JDBCのデモ・プログラムはありますか。

はい。UNIXシステムの場合は$ORACLE_HOME/jdbc/demo/demo.tar、Windows システムの場合は$ORACLE_HOME/jdbc/demo/demo.zipを参照してください。

トップへ戻る
デモの実行方法を教えてください。

demo.tarファイルまたはdemo.zipファイルを解凍します。Samples-Readme.txtファ イルを表示します。最初にこのファイルを参照してJDBCデモの概要を理解してから、Makefile(UNIXの場合)またはrundemo.bat(Windows の場合)を実行します。

トップへ戻る
デモ実行時にエラーが発生した場合はどうすればよいです か。

JDBCデモはエラーなく実行されるはずです。エラーが発生した場合は、現在の構成に問題がある可能性があります。以下の点を確認して ください。

  • クラスパス
  • 正しいJDKバージョンであること
  • 予備テストの要件について、Samples-Readme.txtMakefile、お よび各.javaファイルを参照していること
トップへ戻る

Oracle JDBCトレース機能

JDBCトレース機能とは何ですか。

JDBC トレース機能は、以前のバージョンのOracle JDBCに組み込まれているランタイム・デバッグ支援機能です。この機能を有効にすると、Oracle JDBCドライバの実行に関するメッセージが出力されます。通常このメッセージには、メソッド・エントリ、パラメータ値、重要な内部状態、内部エラー、メ ソッド終了、および戻り値が含まれています。

Oracleトレース機能は 10.1.0の時点では、classes12_g.jarとclasses12dms_g.jarでのみサポートされています。JDK 1.4以降をサポートするすべてのOracle JDBCドライバでは、java.util.loggingで組み込みトレース機能が使用されます。JDBC 11、ojdbc14_g.jar、またはojdbc14dms_g.jarを使用する際にトレース情報を取得する方法については、java.util.loggingに関するセクションを参照してください。

JDBCアプリケーションに問題がある場合は、トレース機能が役に立ちます。大部分のメッセージは内部JDBCメソッドに関するもので あるため、不明確な場合があります。その場合でも、何らかの役に立つ可能性はあります。開始時はトレース量を1に設定す ることを推奨します。

JDBC にバグが存在すると考えられる場合、トレース機能が役に立つ可能性があります。この場合は、トレース量をデフォルト値のままにしておきます。ただし、この 設定では大量の出力が生成されるため、小規模なテスト・ケースをトレースするか、または大規模なアプリケーションの限られた部分のみをトレースする必要が あります。障害が発生する前に、適切なコードであることを確認してから組み込むようにしてください。

トップへ戻る
トレース機能を有効にする方法を教えてください。

JDBC 11を使用する際にトレース情報を取得する方法については、java.util.loggingに 関するセクションを参照してください。

JDBC トレース機能を使用するには、デバッグjarファイルclasses12_g.jarまたはclasses12dms_g.jarを使用する必要がありま す。他のいずれかのjarまたはzipファイルによりトレース機能を使用すると、エラー・メッセージが表示されるか、または一切の出力が得られません。

ト レース機能を制御するには、プログラム的またはプロパティを使用する2つの方法があります。プログラム的なAPIを使用すると、アプリケーションの実行中 にトレース機能を有効または無効にして、他のプロパティを変更できます。トレース・データは大量になる場合が多いため、コード内の特に疑わしい部分に対し てのみトレース機能を有効にするのが適切な方法です。アプリケーション・ソースの変更が簡単ではない場合は、プロパティを使用してトレース機能を制御でき ます。このプロパティはアプリケーションの起動時に一度読み取られるだけで、再度読み取られることはありません。プロパティとAPIは同時に使用できま す。プロパティで初期状態が設定され、APIでその状態が変更されます。

トレース機能をプログラム的に有効にするもっとも簡単な方法は、

oracle.jdbc.driver.OracleLog.startLogging ();をコールすることです。これにより、トレース情報がSystem.outに送信されます。トレース機能を無効にするには、 oracle.jdbc.driver.OracleLog.stopLogging();をコールします。トレース機能を有効にするには、System プロパティoracle.jdbc.Trace"true"に設定します(java -Doracle.jdbc.Trace=true MyApp)。下で説明する他のJDBCトレース機能プロパティのいずれかで、暗黙的にoracle.jdbc.Trace"true"に 設定します。トップへ戻る
トレース出力量の制御方法を教えてください。

JDBC 11を使用する際にトレース情報を取得する方法については、java.util.loggingに 関するセクションを参照してください。

JDBCトレース機能では、大量の出力が生成される場合があります。出力量を制御するもっとも簡単な方法は、次のようにして必要な場合 にのみトレース機能を有効にすることです。

oracle.jdbc.driver.OracleLog.startLogging(); myApp.suspectCode(); oracle.jdbc.driver.OracleLog.stopLogging(); ただし、多くの場合において使用できません。また、トレース・メッセージ数も減少させるには、トレース量を次のように設定します。 oracle.jdbc.driver.OracleLog.setLogVolume(1);デフォルト値は2です。最大値は3ですが、現在全体で2を 超える量が生成されることはありません。1ではデフォルトより大幅に少なくなります。

各行のサイズを制御するには、明示的に行サイズを設定するか、または行ごとに出力されるフィールドを変更します。最大行長を変更するに は、次のように設定します。

oracle.jdbc.driver.OracleLog.setMaxPrintBytes(100);またはjava -Doracle.jdbc.MaxPrintBytes=100 MyApp

出力されるフィールドを制御するには、プロパティoracle.jdbc.PrintFieldsを次のように設定します。

java -Doracle.jdbc.PrintFields=none MyApp有効な値は次のとおりです。
  • none:メッセージのみを出力します
  • default
  • thread:defaultと同じですが、スレッド名が追加されます
  • all
トップへ戻る
トレース情報の出力先はどこですか。

JDBC 11を使用する際にトレース情報を取得する方法については、java.util.loggingに 関するセクションを参照してください。

デフォルトでは、トレース情報の出力先はSystem.outです。他の場所に出力するには、プロパティoracle.jdbc.LogFile

java -Doracle.jdbc.LogFile=/tmp/jdbc.log MyAppに設定するか、またはsetLogStream api. oracle.jdbc.driver.OracleLog.setLogStream(System.err);をコールします。log streamを設定してもトレースが開始されます。トレース機能を無効にするには、log streamをnullに設定します。トップへ戻る
DMS対応jarでDMSを無効にする方法を教えてくださ い。

oracle.dms.console.DMSConsole というSystemプロパティがあります。このプロパティを設定しないと、DMSがアクティブになります。このプロパティを oracle.dms.instrument_stub.DMSConsoleに設定するとスタブ実装が使用され、事実上DMSが無効になります。アプリ ケーションでDMSを無効にする1つの方法は、次をコールすることです。

System.setProperty( "oracle.dms.console.DMSConsole", "oracle.dms.instrument_stub.DMSConsole");ただし、DMSコードが実行される前にコールする必要があります。 別の方法は、次のようにJava VMで-Dオプションを使用することです。java -Doracle.dms.console.DMSConsole=oracle.dms.instrument_stub.DMSConsole MyAppトップへ戻る

開発ツールと環境

JDBCプログラムはSymantec Visual Cafeでデバッグできますか。

現在、Visual Cafeはサポートされていません。

トップへ戻る
JDBCプログラムはMicrosoft Visual J++でデバッグできますか。

現在、Visual J++はサポートされていません。

トップへ戻る

サポートされる機能

JDBCドライバはPL/SQLストアド・プロシージャにアクセスでき ますか。

は い。Oracle JDBC OCIドライバとシンJDBCドライバの両方で、PL/SQLストアド・プロシージャおよび無名ブロックの実行がサポートされています。また、SQL: 2003エスケープ構文とOracleエスケープ構文の両方がサポートされています。次のPL/SQLコールは、両方のOracle JDBCドライバから使用できます。

  • SQL:2003構文の場合: CallableStatement cs1 = conn.prepareCall ("{call proc (?,?)}"); CallableStatement cs2 = conn.prepareCall ("{? = call func (?,?)}");
  • Oracle構文の場合: CallableStatement cs1 = conn.prepareCall ("begin proc (:1,:2); end;"); CallableStatement cs2 = conn.prepareCall ("begin :1 := func (:2,:3); end;");
トップへ戻る
JDBCドライバではストリーミングはサポートされていま すか。

は い。Oracle JDBC OCIドライバとシンJDBCドライバの両方で、クライアントとサーバー間のいずれの方向においてもデータのストリーミングがサポートされています。ま た、バイナリ、ASCII、およびUnicodeのすべてのストリーム変換がサポートされています。詳しくは、Oracle JDBCドライバ・ドキュメントのストリームに関するチュートリアルを参照してください。

トップへ戻る
JDBCドライバではマルチバイト・キャラクタ・セットは サポートされていますか。

は い。Oracle JDBC OCIドライバとシンJDBCドライバの両方で、マルチバイト・キャラクタ・セットがサポートされています。両方ともOracleキャラクタ・セットが使 用されているデータベースにアクセスできます。また、マルチバイト・キャラクタがUnicode 1.2に変換されます。JDBC OCIドライバはこれまでテストされてきており、すべての欧州キャラクタ・セットおよびすべてのアジア・キャラクタ・セット(中国語、日本語、韓国語を含 む)がサポートされています。

トップへ戻る
JDBCドライバはファイアウォールとともに動作できます か。

は い。JDBC OCIドライバとシンJDBCドライバは両方ともに、イントラネット設定およびエクストラネット設定で動作できます。これらのドライバはエクストラネット 導入環境では、SQL*Net認定済みの業界トップクラスのファイアウォールとともに使用できます。今日では、次のベンダーのファイアウォールが SQL*Netで認定済みです。

  • ステートフル・インスペクション・ファイアウォール:Checkpoint、SunSoft、およびCISCO Systemsのファイアウォール
  • プロキシベース・ファイアウォール:Milkyway Networks、Trusted Information Systems、Raptor、Secure Computing Corporation、およびGlobal Internetのファイアウォール
トップへ戻る
Oracle JDBCドライバではPL/SQL表/結果セット/レコード/ブールはサポートされていますか。

い いえ。Oracle JDBCドライバでは、PL/SQL型、TABLE(現在は、Indexed-by Tables)、RESULT SET、RECORD、およびBOOLEANのコール引数と戻り値はサポートされていません。現時点でこの内容を変更する計画はありません。代わりに、 RefCursor、Oracle Collection、およびStructured Object Typeを使用することを推奨します。

回避策として、JDBCでサポートされる型としてデータを処理するラッパー・プロシージャを作成できます。

た とえば、PL/SQLブールが使用されているストアド・プロシージャをラッピングするには、JDBCから文字または数値を取得するストアド・プロシージャ を作成して、それをBOOLEANまたは出力パラメータとして元のプロシージャに渡します。次に、元のプロシージャからBOOLEAN引数を受け入れ、そ れをCHARまたはNUMBERとしてJDBCに渡します。同様に、PL/SQLレコードが使用されているストアド・プロシージャをラッピングするには、 個別のコンポーネントでレコードを処理するストアド・プロシージャを作成します(CHAR、NUMBERなど)。PL/SQL表が使用されているストア ド・プロシージャをラッピングするには、データをコンポーネントに分けるか、またはOracle Collection型を使用します。

次に、入力としてBOOLEANを取得するストアド・プロシージャPROCのPL/SQLラッパー・プロシージャMY_PROCの例を 示します。

PROCEDURE MY_PROC (n NUMBER) IS BEGIN IF n=0 THEN proc(false); ELSE proc(true); END IF; END; PROCEDURE PROC (b BOOLEAN) IS BEGIN ...END;トップへ戻る
フェイルオーバーはサポートされていますか。

は い。RACサーバーに接続している際には、高速接続フェイルオーバーにより障害イベントに対して即座に応答します。この新しい高可用性機能はドライバに依 存せず、Implicit Connection CacheおよびRACと連携して動作し、キャッシュで最大の接続可用性を実現します。これを達成するには、RACの停止イベントを処理して有効な接続と UPイベントを削除し、既存の接続間でロードバランシングを実行します。

OCI ドライバを使用している際に問合せのフェイルオーバーが必要な場合は、TAFについて検討してください。TAFでは、アプリケーションでおもに問合せフェ イルオーバーが使用されています。ただし、これは一般的なフェイルオーバー・メカニズムではありません。高速接続フェイルオーバーとTAFは同時には使用 できません。一度に有効にして使用できるのはいずれか1つのみです。

トップへ戻る
JDBCドライバによるOracle ROWIDデータ型のサポート方法を教えてください。このことは、getCursorNameおよびsetCursorNameとどのように関係している のですか。

getCursorNameおよびsetCursorName JDBCエントリポイントはサポートされていません。代わりに、同様の機能を提供するROWIDにアクセスできます。JDBC 4.0ではjava.sql.Rowidが定義されていますが、これはoracle.sql.ROWIDと完全に互 換性があり、JSE 6(ojdbc6.jar)ドライバでサポートされています。

問合せにROWID疑似列を追加する場合は、ResultSet getStringエントリポイントによりJDBCに取得できます。また、setStringエントリポイントにより ROWIDをpreparedStatementパラメータにバインドすることもできます。

この場合は次の例のように、インプレース更新が可能になります。

ResultSetMetaDataクラスにおいて、ROWIDを含む列は型oracle.jdbc.driver.OracleTypes.ROWIDで 報告されます(値は-8)。

トップへ戻る
JDBCドライバによるOracle REFCURSORデータ型のサポート方法を教えてください。

Oracle JDBCドライバでは、REFCURSOR型のバインド変数がサポートされています。REFCURSORは、JDBC ResultSetによって表されます。CallableStatementgetCursorメ ソッドを使用して、PL/SQLブロックによって返されたREFCURSOR値をResultSetに変換します。JDBCにより、問合せを実行して結果 セットを返すストアド・プロシージャをコールします。対応するCallableStatementを oracle.jdbc.driver.OracleCallableStatementにキャストし、getCursorメソッドを使用します。

トップへ戻る
ANOはJDBCドライバとともに動作しますか。

バージョン9.2の時点では、OCIドライバとThinドライバの両方でANOがサポートされています。

ANOは、8.0.X OCIドライバのバージョン8.0.x以降とともに動作します。この機能を適切に動作させるために、8.0.4、8.0.5、および8.0.6用の最新の パッチセットを入手する必要があります。

注: 8.1.5および8.1.6 SDKには、既知のバグ(#899424)が存在します。このバグ修正を入手したとしても、以前のすべてのリリースに対するパッチとしてバックポートおよ びリリースされているわけではありません。現時点では、8.1.5および8.1.6 SDKにおけるこのバグは依然として存在したままです。

このバグ修正は8.1.6コードにはすでに組み込まれているため、8.1.6ではパッチは必要なく、コードは正常に動作するはずです。 詳しくは、バグ#899424を参照してください。

トップへ戻る
oracle.sql.*データ型はシリアライズできます か。

はい。SQLデータ型を表すoracle.sql.*クラスはすべてシリアライズ可能です。

トップへ戻る
JDBCドライバではオブジェクトまたはコレクションはサ ポートされていますか。

はい。Oracle JDBCドライバではオブジェクトとコレクションがサポートされています。8.1.5以降でサポートされています。

トップへ戻る
WaitOptionおよびAutoRollbackは使 用できますか。

バッチ・コール用のWaitOptionおよびAutoRollbackロールバック・オプションは非推奨であり、現在は使用できませ ん。現在、次のメソッドは使用できません。

public void setAutoRollback (int autoRollback); public int getAutoRollback(); public void setWaitOption(int waitOption); public int getWaitOption();トップへ戻る
1つのデータベース・インスタンスのJavaストアド・プ ロシージャにより、別のデータベース・インスタンスへの接続をオープンできますか。

はい。その場合は、Thinサーバー・ドライバを使用します。8.1.6 SDK以降でサポートされています。

こ の時点における唯一の既知の回避策は、2番目のインストール時にDBLINKを使用するように、最初のインストールを構成することです。このようにして、 JDBCドライバに対してまだ同じ1つのインスタンスで動作していると偽の判断をさせたうえで、DBLINKを利用して詳細な部分に対処します。ただし、 MTSサーバー・インストールでDBLINK使用に関する問題が発生していると誤って推測されます。

トップへ戻る

パフォーマンス

より高速なのは、ThinドライバまたはOCIドライバのどちらですか。

そ れはモデルによって異なります。Thinドライバの方が高速なアプリケーションもあれば、OCIドライバの方が高速なアプリケーションもあります。 10.1.0の時点では、おそらくThinドライバの方がOCIドライバよりも多少高速です。クライアントとサーバーのハードウェアとOSが同じタイプの場 合、Thinドライバの方が高速である一方、OCIドライバではRDBMSへの負荷が多少減少します。通常その差は小さく、10%未満です。大部分のお客様 は、管理がより簡単なThinドライバを使用しています。ただし、お客様に応じて有用性は異なります。

トップへ戻る
より高速なのは、Statementまたは PreparedStatementのどちらですか。

SQL が一度だけ実行される場合は、Statementの方が多少高速であると考えられます。ただし、SQLが2度以上実行される場合は、 PreparedStatementの方がかなり高速になります。ステートメント・キャッシュを使用する必要がある場合、キャッシュから文を取得するのは 同じ文を実行することと同じです。

通常は、 PreparedStatementを使用することを強く推奨します。特に、ユーザーがSQLで指定したデータを送信する場合がこれに該当します。データ をPreparedStatementパラメータにバインドすることにより、大部分のSQL注入攻撃を回避できます。Statementを使用する際のパ フォーマンス上のメリットは無視できる程度です。

トップへ戻る

java.util.logging


java.util.loggingを使用して、 Oracle JDBCドライバのトレース出力を取得する方法を教えてください。

最 初に、ロギング・コードが含まれるjarファイルを使用する必要があります。最適化されたjarファイルojdbc5.jarとojdbc6.jarに は、ロギング・コードは含まれていません。非デバッグDMS jarファイルojdbc5dms.jarとojdbc6dms.jarには、何らかのロギング・コードが含まれています。デバッグjarファイル *_g.jarには、さまざまなロギング・コードが含まれています。クラスパスには、必要以上のOracle JDBC jarファイルを含めないようにしてください。

次に、Oracle JDBCロギングを有効にする必要があります。ロギングをグローバルに有効にするには、Systemプロパティを-Doracle.jdbc.Trace =trueと設定するか、またはOracle JDBC Diagnosability MBeanを使用してプログラム的に制御します。// create name javax.management.ObjectName name = new javax.management.ObjectName("com.oracle.jdbc:type=diagnosibility,name=*"); // get the MBean server javax.management.MBeanServer mbs = java.lang.management.ManagementFactory.getPlatformMBeanServer(); // find out if logging is enabled or not System.out.println("LoggingEnabled = " + mbs.getAttribute(name, "LoggingEnabled")); // enable logging mbs.setAttribute(name, new javax.management.Attribute("LoggingEnabled", true)); // disable logging mbs.setAttribute(name, new javax.management.Attribute("LoggingEnabled", false));

ロギングを有効にするだけで、出力が最低限に抑えられます。詳細および対象となる出力が必要な場合は、java.util.loggingを 構成する必要があります。

トップへ戻る
java.util.loggingを 構成して、Oracle JDBCの有効なトレース出力を取得する方法を教えてください。

JDBCコードにより多数のロガーが作成されます。必要とする出力を取得するには、これらのロガーごとにlogLevelを設定し、い ずれかの場所にハンドラを追加する必要があります。詳しくは、java.util.loggingのJavaDocを参照してくださ い。

または、Oracle JDBCドライバ・インストールの一部としてdemo.zipファイルで提供された、便利な プロパティ・ファイルOracleLog.propertiesを使用できます。使用方法は、このファイルのコメントに記載されていま す。この方法は非常に簡単であるため、強く推奨します。

い ずれのケースでも、ロギングを有効にしてトレース出力を取得する必要があります。ロガーを再構成しなくても、トレース出力の有効および無効を切り替えるこ とができます。Diagnosability MBeanは、ロガーには一切関係しません。MBeanをコールするようにソースを変更しない場合は、Java実行コマンドに-Doracle.jdbc.Trace=trueを 追加します。これにより、全実行がログに記録されます。

JDBCロギングの構成について詳しくは、JDBCロギングに関するホ ワイト・ペーパーを 参照してください。次にいくつかのヒントを示します。「Level」を「INFO」に設定すると、実行されるSQLがログに記録されます。「Level」 を「FINE」に設定するとエントリがログに記録され、すべてのpublicメソッドが終了します。「Level」を「FINE」を超える設定にすると、 ディスク領域がいっぱいになるまでログ・ファイルに保存されます。この場合、警告が通知されます。

トップへ戻る
サーバー側内部ドライバについて教えてください。

10.1.0の場合、サーバー側内部ドライバではJDK 1.4が使用され、トレース出力にはjava.util.loggingが 使用されます。サーバーにある便利なOracleLog.propertiesファイルを使用するには、次を実行します。

System.setProperty("java.util.logging.config.file", "OracleLog.properties")

OracleLog.properties$ORACLE_HOMEに配置します。

トップへ戻る