Oracle® JDBC for Rdb FAQ

 

リリースV7.2-40

 

部品番号: E06182-01

 

原本名: Oracle JDBC for Rdb Frequently Asked Questions, Release V7.2-40

 

2008年5月

 

インストール  2

Oracle JDBC for Rdbドライバを実行するには何が必要ですか。  2

OpenVMS for VAXシステム上でこれらのドライバを実行できますか。  3

どのような割当て制限が必要ですか。  3

Oracle JDBC for Rdbドライバのインストール方法を教えてください。  3

ドライバが使用する実行可能ファイルおよびその機能は何ですか。  4

JARとは何ですか。  4

キットに含まれている様々なJARファイルの機能は何ですか。  4

これらのJARファイルはどこにありますか。  5

JARファイルおよび共有イメージを適切な場所にコピーした後、これらが正しく設定されていることをテストするにはどうしたらよいですか。  5

RDBJDBCCHECKUPを実行しようとするとjava.lang.NoClassDefFoundErrorという例外が表示されます。  5

RDBJDBCCHECKUPを実行しようとすると、NoClassDefFoundError例外がまだ表示されます。  6

JAVAでOracle JDBC for Rdbネイティブ・ドライバが検出されません。  6

Java on OpenVMSの情報はどこで入手できますか。  7

Oracle JDBC for Rdbシン・ドライバの使用方法   7

Oracle Rdbデータベースと同じノード上にないクライアントからOracle JDBC for Rdbドライバを介してOracle Rdbデータベースと対話する方法を教えてください。  7

様々なOracle JDBC for Rdbサーバーを使用できるようですが、これらのサーバーについて教えてください。  7

実行するOracle JDBC for Rdbサーバーの選び方を教えてください。  7

Oracle JDBC for Rdbシン・サーバーのインスタンスの開始方法を教えてください。  8

Oracle JDBC for Rdbマルチ・プロセス・サーバーのインスタンスの開始方法を教えてください。  8

シン・サーバーのデフォルト属性を変更できますか。  9

同じノード上でシン・サーバーの複数のインスタンスを開始できますか。  9

dbサーバー・ノードMYDBNODE上でポート1703を使用してシン・サーバーを起動しましたが、アプリケーションにこのサーバーと対話させるにはどうすればよいですか。  9

Oracle JDBC for Rdbシン・ドライバを使用することをアプリケーションに伝える方法を教えてください。  9

ドライバの登録は完了しましたが、次に、ポート1703を使用してMYDBNODEのデータベースに接続するにはどうすればよいですか。  10

接続拒否の例外が表示されます。  10

RDB--E-BAD_DB_FORMATエラーが表示されます。  11

RDB-E-AUTH_FAILエラーが表示されます。  11

“Maximum number of clients exceeded”というエラーが表示されます。  11

“Software caused connection abort”というエラーが表示されます。  11

シン・サーバーの停止方法を教えてください。  12

ノード上でいくつかのシン・サーバーを起動しましたが、そのうちの空いている1つにアプリケーションを接続しようと思います。アプリケーションから各シン・サーバーに順番に接続していく以外の方法を教えてください。  12

シン・プール・サーバーの起動方法を教えてください。  12

使用可能なサーバーのプールを増やすためにプール・サーバーをカスケードできますか。  13

前のバージョンのOracle JDBC for Rdbドライバでは、標準の構成ファイルを使用していました。これらのファイルはまだサポートされていますか。  13

シン・サーバーの構成ファイルには何が含まれているのですか。  13

シン・プール・サーバーを起動する前に、プールされているシン・サーバーを明示的に起動する必要はありますか。  14

シン・プール・サーバーを起動する前に、すべてのシン・サーバーを起動しておく必要はありますか。15

サーバー・プールから空きサーバーにアクセスする方法を教えてください。  15

プール・サーバーの操作は接続プーリングと同じですか。  15

シン・プール・サーバーを介してサーバーにアクセスしようとすると、“No Rdb Thin Server currently available”というメッセージが表示されます。  15

OracleJDBC for Rdbシン・サーバーを使用していますが、なぜかクライアントが途中終了してしまいます。  この問題の詳しい情報を知りたいのですが。  15

RdbJdbcCheckup.java以外にも、基本的なJDBC操作の手順を示すJavaソースのサンプルはありますか。  17

SELECT文を実行しようとするたびに-COSI-F-CREATERRが表示されます。  18

Oracle JDBC for Rdbコントローラ   20

Oracle JDBC for Rdbコントローラとは何ですか。  20

Oracle Rdbユーザー用Oracle JDBC for Rdb  20

Oracle JDBC for Rdbドライバで使用できるSQL構文に制限はありますか。  20

従来のように、JDBCインタフェースを使用して'CREATE TABLE'などのDDL(データ定義言語)文を使用できますか。  20

前述のエスケープ処理とは何ですか。  20

Rdb対応の対話型SQLでは、表の表示を実行してデータベース内の表を確認できます。JDBCを使用して同じことができますか。  21

"SHOW TABLE EMPLOYEES"などを実行するにはどうしたらよいですか。  22

無効な操作という例外が表示されます。  23

JDBCを使用する場合に、Oracle Rdbのデバッグ・フラグを使用して問合せの戦略などを確認できますか。  23

問合せに対してOracle Rdbによって戻される行数を制限するために、これまでどおりSELECT文でLIMIT TO句を使用できますか。  23

 

 

インストール

Oracle JDBC for Rdbドライバを実行するには何が必要ですか。

まず、データベース・サーバーとして機能するシステムが必要です。JAVA VMが必要なため、サーバー側では、OpenVMS AlphaシステムのバージョンV7.2以上が必要になります。

 

ドライバには、JDK 1.4以上をサポートするJava VM(HP Java SDK/RTE for OpenVMS  AlphaのV1.4.1以上など)が必要です。

 

また、サーバー・システムにOracle Rdb V7.1-24以上をインストールする必要があります。

 

クライアント・システムには、任意のオペレーティング・システムを実行する任意のタイプのマシンを使用できます。ただし、JDK 1.4以上をサポートするJava VMがインストールされている必要があります。

 

 

先頭へ戻る

 

OpenVMS for VAXシステム上でこれらのドライバを実行できますか。

できません。現在、これらのドライバはOpenVMS for Alphaでのみサポートされています。 

 

先頭へ戻る

 

どのような割当て制限が必要ですか。

Oracle JDBC for Rdbサーバーを実行するOpenVMSアカウントに必要な割当て制限は、使用されるJAVA VMおよび処理されるクライアント・プロセスの組合せによって大きく異なります。

 

シン・サーバーにクライアントが接続されていないベースラインのメモリー使用量は、JAVA VMによって著しく変化します。

 

JAVAアプリケーションに関するHPの推奨事項に基づいて、Oracleでは、シン・サーバー(特にマルチ・プロセス・サーバー)の起動に使用するアカウントでの最低の割当て制限の設定を次のように推奨します。

 

 

UAF Fillm

4096

Channelcnt

4096

Wsdef

2048

Wsquo

4096

WsextentおよびWsmax

16384

Pgflquo

1500000

bytlm

1000000

biolm

150

diolm

150

tqelm

100

 

これらのプロセスの割当て制限にあわせて、システムの割当て制限を適切に設定してください。

 

Javaで要求されるOpenVMSの割当て制限およびリソースの詳細は、Java for OpenVMSのリリース・ノートを参照してください。

 

また、Oracle Rdbに必要なOpenVMSの割当て制限の推奨事項は、Oracle Rdbのドキュメントを参照してください。

 

 

先頭へ戻る

 

Oracle JDBC for Rdbドライバのインストール方法を教えてください。

 

Oracle JDBC for Rdbドライバは、圧縮ZIPファイルとして提供されるか(Webから入手した場合)、Oracle Rdbの配布CDのRDBJDBCディレクトリに含まれています。

 

基本的に、キットにはJava JARファイル、RDBJDBC実行可能イメージ、コマンド・プロシージャおよび多数のドキュメント・ファイルが含まれています。

 

キットのインストールにはOpenVMS PRODUCTコマンド(Polycenter)が使用されます。

 

RDBJDBC_RELNOTESファイルには、ドライバのインストール方法に関する情報が含まれています。

 

詳細は、RDBJDBC_RELNOTESファイルを参照してください。

 

 

先頭へ戻る

 

ドライバが使用する実行可能ファイルおよびその機能は何ですか。

 

デフォルトでは、インストール時に次に示すシステムのRdb JDBCディレクトリにキットの内容がコピーされます。

                      SYS$COMMON:[RDB$JDBC.0701-3xxxx]

 

‘xxxx’は、インストールされるキットのビルド・インスタンスです。

 

 

RDBJDBCSHR71.EXEは、標準シン・サーバーのOracle Rdbデータベース・システムと実際に対話する共有イメージです。  Oracle JDBC for Rdbネイティブ・ドライバおよび標準シン・サーバーは、この共有イメージを介してOracle Rdbと対話します。

          

サーバー・システムでは、RDBJDBCSHR71イメージおよびこのイメージがあるディレクトリを指定するように、論理名RDBSHRを設定する必要があります。

 

RDBJDBCMPSHR71.EXEは、RDBJDBCSHR71.EXEと類似した共有イメージですが、複数のサブプロセスを使用してデータベースとの相互作用を実行します。  これは、シン・マルチ・プロセス・サーバーの一部を形成します。

 

サーバー・システムでは、RDBJDBCMPSHR71イメージおよびこのイメージがあるディレクトリを指定するように、論理名RDBJDBCMPSHRを設定する必要があります。

 

RDBJDBCEXEC.EXEは、マルチ・プロセス・サーバーに接続されているクライアントのかわりに実際にデータベースを操作するエグゼキュータ・イメージです。

 

インストール時にコマンド・プロシージャが自動作成されるため、システム全体で使用するドライバおよびサーバーの論理名の設定を簡単に行えます。

 

 

先頭へ戻る

 

JARとは何ですか。

JARファイルは、複数のクラスおよびその他のコンポーネントを格納するためにJavaで使用される拡張ZIPファイルです。このファイルは、Javaクラス一式をパッケージ化してアプリケーションをより簡単に配布することを可能にしています。 

 

JavaでJARファイルから直接クラスを実行できるため、あらかじめクラスを抽出しておく必要はありません。

 

 

先頭へ戻る

 

 

キットに含まれている様々なJARファイルの機能は何ですか。

これらのJARファイルには、JavaとOracle Rdbの間でのJDBCインタフェースを使用した相互作用に必要なJavaクラスが含まれています。

 

 

先頭へ戻る

 

 

これらのJARファイルはどこにありますか。

JARファイルは、デフォルトでは次に示すシステムのRdb JDBCディレクトリにインストール時にコピーされます。

                      SYS$COMMON:[RDB$JDBC.0701-3xxxx]

 

‘xxxx’は、インストールされるキットのビルド・インスタンスです。

 

JARファイルは、必要なときにアプリケーションがアクセスできる場所であれば、システムの任意の場所にコピーできます。

 

          

JAVA CLASSPATH検索リストの指定方法の詳細は、Javaのドキュメントを参照してください。

 

 

先頭へ戻る

 

JARファイルおよび共有イメージを適切な場所にコピーした後、これらが正しく設定されていることをテストするにはどうしたらよいですか。

環境の設定が完了したら、キットに含まれているRDBJDBCCHECKUP.CLASSファイルを使用して設定をチェックできます。

          

この単純なJAVAアプリケーションによって、指定したデータベースへの接続が試行され、接続に成功すると、接続が確立されてOracle JDBC for Rdbドライバ用の環境設定が正しく行われていることを示すメッセージが表示されます。

 

このアプリケーションの使用方法の詳細は、RDBJDBC_RELNOTESファイルに記載されています。

 

 

先頭へ戻る

 

RDBJDBCCHECKUPを実行しようとするとjava.lang.NoClassDefFoundErrorという例外が表示されます。

ドライバのインストールが終了し、チェックアップ・プログラムを使用しようとしましたが、次のエラーが表示されました。

 

           java.lang.NoClassDefFoundError: rdbjdbccheckup

 

原因は何ですか。

 

いくつかの問題が考えられますが、エラー・メッセージ内のクラス名がすべて大文字か、またはすべて小文字になっている場合は、クラス名を引用符で囲まなかった可能性があります。

 

JAVAでは大文字と小文字が区別されます。そしてこのクラスの名前は大文字と小文字の両方を使用して構成されています。

 

クラス名は、必ず大文字と小文字を正しく入力する必要があります。  VMSでは、デフォルトで、コマンドラインのすべてのテキストが大文字に変換されてからアプリケーションに渡されます。  大文字に変換されないようにするには、名前を二重引用符で囲む必要があります。

 

次に例を示します。

                     

$java "RdbJdbcCheckup"

 

先頭へ戻る

 

RDBJDBCCHECKUPを実行しようとすると、NoClassDefFoundError例外がまだ表示されます。

前述の説明どおりにしましたが、まだ次のエラーが表示されます。

 

java.lang.NoClassDefFoundError: RdbJdbcCheckup

 

原因は何ですか。

 

クラス名が正しく、クラス・ファイルがデフォルト・ディレクトリにあるとすると、システム上でのJAVA環境の設定方法により、デフォルトのCLASSSPATHに現行ディレクトリが含まれていない可能性があります。

 

コマンドラインでCLASSPATHを直接指定することで解決できる可能性があります。

 

次に例を示します。

 

           $java -cp ."RdbJdbcCheckup"

 

注意:

現行のデフォルト・ディレクトリを含めるようにJAVAに指示する-cpスイッチの後のドット'.'は、CLASSPATH検索リストです。

 

VMS形式またはUNIX形式のコマンドラインで起動するためのJAVAの設定方法の詳細は、JAVA on OpenVMSのドキュメントを参照してください。

 

先頭へ戻る

 

JAVAでOracle JDBC for Rdbネイティブ・ドライバが検出されません。

前述の説明どおりにしましたが、次のエラーが表示されます。

 

java.lang.NoClassDefFoundError: oracle/rdb/jdbc/rdbNative/Driver


原因は何ですか。

 

Javaは、RdbJdbcCheckup.classを検出したためOracle JDBC for Rdbネイティブ・ドライバを起動しようとしましたが、このクラスを検出できませんでした。

 

この場合も、原因はCLASSPATHにあると考えられます。

 

JAVAがRDBNATIVE.JARを起動するためには、RDBNATIVE.JARがJAVA CLASSPATHにあることが必要です。

 

この方法はいくつかあり、JAVAのドキュメントに記載されています。たとえば、次のようにJARファイル指定をCLASSPATHスイッチに含めます。

 

           $java -cp .:"rdbNative.jar" "RdbJdbcCheckup"

 

注意:

この例は、現行のデフォルト・ディレクトリにJARファイルも含まれていることを前提としています。

 

先頭へ戻る

 

Java on OpenVMSの情報はどこで入手できますか。

HPのWebサイトでJava on OpenVMSのドキュメントを検索できます。

 

HPのJava for OpenVMSシステムのドキュメントは、次のサイトで検索できます。

 

http://h18012.www1.hp.com/java/documentation/

 

Java on OpenVMSのよくある質問のページは、次のサイトにあります。

http://h18012.www1.hp.com/java/faq/ovms.html

 

 

先頭へ戻る

 

 

Oracle JDBC for Rdbシン・ドライバの使用方法

 

Oracle Rdbデータベースと同じノード上にないクライアントからOracle JDBC for Rdbドライバを介してOracle Rdbデータベースと対話する方法を教えてください。

Oracle JDBC for Rdbシン・ドライバおよびOracle JDBC for Rdbシン・サーバーを使用して、リモート・クライアント・システムからOracle Rdbデータベースにアクセスできます。

          

シン・ドライバを使用してOracle Rdbにアクセスするには、次の手順を行う必要があります。

 

  1. データベースがあるOpenVMS AlphaノードにOracle JDBC for Rdbドライバ・キットをインストールします。
  2. dbサーバー・ノード上でOracle JDBC for Rdbシン・サーバーのインスタンスを開始します。
  3. RDBTHIN.JARをクライアント・システムにコピーして、クライアント・アプリケーションがこれにアクセスできるようにJAVA CLASSPATHを設定します。
  4. JDBC CONNECT文で適切な接続URLを使用して、データベースにアクセスします。

 

 

先頭へ戻る

 

 

様々なOracle JDBC for Rdbサーバーを使用できるようですが、これらのサーバーについて教えてください。

現在使用できるサーバーには3種類あります。

 

 

すべてのサーバーはマルチスレッドで、複数のクライアント接続を同時に処理できます。

 

標準シン・サーバーおよびシン・マルチ・プロセス・サーバーは、接続されているシン・ドライバ・クライアントのかわりに、Oracle Rdbデータベースのアクションを実行します。

 

シン・プール・サーバーは、接続リクエストを他のサーバーに再分散するスイッチング・サーバーです。

 

先頭へ戻る

 

実行するOracle JDBC for Rdbサーバーの選び方を教えてください。

3種類のサーバーには、それぞれ異なる属性およびリソース要件があります。

 

シン・プール・サーバーは、クライアント接続リクエストをネットワーク上の他のシン・サーバーに再分散する予定の場所で実行する必要があります。これによって、クライアントのサーバー・プールへの入り口がシングル・ポイントになります。 プール・サーバーは、接続スイッチング・アプリケーションであり、実際のOracle Rdbデータベースの操作は行いません。

 

標準シン・サーバーは、単一のOpenVMSプロセスで稼働し、複数のクライアント・データベース・アクセスの同時操作を処理するために使用できます。ただし、Oracle Rdbでは同じOpenVMSプロセス内からの複数のデータベース・コンテキストを同期する必要があるため、この同期要件がパフォーマンスに影響を与える可能性があり、同時実行性の問題が発生する可能性が高くなります。  

 

マルチ・プロセス・サーバーも、複数のクライアント・データベース・アクセスの同時操作を処理できますが、複数の子プロセスを使用してデータベース操作を実行するため、標準シン・サーバーより優れた同時実行機能を提供します。  ただし、これによってクライアントとデータベースの間に別の通信レイヤーが生じるため、パフォーマンスが若干低下する可能性があります。

 

標準シン・サーバーは単一のOpenVMSプロセス内で動作するため、メモリーがより効率的に使用されます。そのため、シン・マルチ・プロセス・サーバーほどメモリーを必要としません。

 

要約すると、マルチ・プロセス・サーバーは、単一の標準シン・サーバーより高い同時実行性を提供しますが、より多くのシステム・リソースを使用します。2つのサーバー・タイプのパフォーマンスの違いは、操作の種類および同時クライアントの相互作用によって変化します。

 

 

先頭へ戻る

 

 

Oracle JDBC for Rdbシン・サーバーのインスタンスの開始方法を教えてください。

Oracle JDBC for Rdbシン・サーバーは、インストール・キットに同梱されているRDBTHINSRV.JARに含まれています。

                     

シン・サーバーを起動することは、単純に、デフォルトをこのjarファイルを含むディレクトリに設定した後でこのjarファイルを起動することです。

          

次に例を示します。

                     

           $java -jar rdbthinsrv.jar

 

追加のコマンドライン・スイッチが使用されていなければ、標準シン・サーバーはデフォルト・ポート1701でリスニングして起動します。

 

現在は、Oracle JDBC for RdbコントローラまたはOracle SQL/Servicesマネージャを使用してサーバーを起動することもできます。

詳細は、『Oracle JDBC for Rdbユーザーズ・ガイド』を参照してください。

 

先頭へ戻る

 

Oracle JDBC for Rdbマルチ・プロセス・サーバーのインスタンスの開始方法を教えてください。

Oracle JDBC for Rdbマルチ・プロセス・サーバーも、インストール・キットに同梱されているRDBTHINSRV.JARに含まれています。

                     

サーバー・タイプによって、起動されるシン・サーバーのスタイルが決まります。デフォルトでは、起動するサーバーはタイプRdbThinSrv(標準シン・サーバー)となります。 マルチ・プロセス・サーバーを起動するには、サーバー・タイプをRdbThinSrvMPに設定する必要があります。

 

              $ java –jar rdbthinsrv.jar –type "RdbThinSrvMP"

          

追加のコマンドライン・スイッチが使用されていなければ、起動したマルチ・プロセス・サーバーはデフォルト・ポート1701でリスニングします。

 

現在は、Oracle JDBC for RdbコントローラまたはOracle SQL/Servicesマネージャを使用してサーバーを起動することもできます。

詳細は、『Oracle JDBC for Rdbユーザーズ・ガイド』を参照してください。

 

先頭へ戻る

 

 

シン・サーバーのデフォルト属性を変更できますか。

 

Oracle JDBC for Rdbシン・サーバーでは、多数の属性がデフォルトで設定されています。これらは、サーバーの起動時に変更できます。

 

これらの属性の基本的な変更方法は、次の2通りです。

 

  1. コマンドラインで適切なスイッチを使用する
  2. 構成ファイルを使用してファイル内で適切な値を設定する

 

 

シン・サーバーの属性の詳細は、『Oracle JDBC for Rdbユーザーズ・ガイド』を参照してください。

 

先頭へ戻る

 

同じノード上でシン・サーバーの複数のインスタンスを開始できますか。

 できます。ただし、各インスタンスに異なるポートを割り当ててリスニングさせる必要があります。

 

 

    $spawn/nowait/proc=thinserv1 java -jar rdbthinsrv.jar -port 1705

    $spawn/nowait/proc=thinserv2 java -jar rdbthinsrv.jar -port 1706

    $spawn/nowait/proc=thinserv3 java -jar rdbthinsrv.jar -port 1707

 

現在は、Oracle JDBC for RdbコントローラまたはSQL/Servicesマネージャを使用してサーバーを起動することもできます。

詳細は、『Oracle JDBC for Rdbユーザーズ・ガイド』を参照してください。

 

先頭へ戻る

 

 

 

 dbサーバー・ノードMYDBNODE上でポート1703を使用してシン・サーバーを起動しましたが、アプリケーションにこのサーバーと対話させるにはどうすればよいですか。

アプリケーションを実行するクライアント・システムにRDBTHIN.JARをコピー済で、JavaでこのJARファイルが認識されるようにJava環境を設定済であると仮定すると、アプリケーションに次の2つを認識させる必要があります。

                     

  1. 使用するJDBCドライバの名前
  2. 接続先データベースのURLおよびユーザー名とパスワード

 

 

先頭へ戻る

 

 

Oracle JDBC for Rdbシン・ドライバを使用することをアプリケーションに伝える方法を教えてください。

使用するJDBCドライバを伝えるためのメソッドは、アプリケーションによって異なります。

 

各アプリケーションでどのメソッドを使用するかについては、それぞれのアプリケーションのドキュメントを参照してください。

 

使用するOracle JDBC for Rdbシン・ドライバのフルネームは次のとおりです。

 

           "oracle.rdb.jdbc.rdbThin.Driver"

 

 

Oracle RdbデータベースへのアクセスにJDBCを使用するJavaクラスを記述する場合、Oracle JDBC for Rdbシン・ドライバを使用することをJDBC Driver Managerに伝える方法の1つは、Class.forName()メソッドを使用することです。

 

次に例を示します。

 

           Class.forName ("oracle.rdb.jdbc.rdbThin.Driver");

 

これにより、ドライバは自身の存在をJDBC Driver Managerに伝え、その結果、ドライバが使用可能になります。

 

なお、次のようにして、使用するJDBCドライバを直接伝えることもできます。

 

           DriverManager.registerDriver(new oracle.rdb.jdbc.rdbThin.Driver());

 

 

先頭へ戻る

 

 

 

ドライバの登録は完了しましたが、次に、ポート1703を使用してMYDBNODEのデータベースに接続するにはどうすればよいですか。

JDBC Driver ManagerをコールしてデータベースへのJDBC接続を確立し、独自の接続を割り当てる必要があります。  次の内容を指定する接続URLを渡す必要があります。

 

 

さらに、ユーザー名とパスワードの指定が必要な場合もあります。

 

たとえば、MYDBNODEシステム上のdisk1:[jones]に格納されているpersonnel.rdbに接続する場合は、次のように指定します。

 

 

     Connection conn = DriverManager.getConnection

         ("jdbc:rdbThin://MYDBNODE:1703/disk1:[jones]personnel", "jones", "mypassword");

 

 

正常に処理されれば、これでデータベースに接続されます。

 

 

先頭へ戻る

 

 

 

接続拒否の例外が表示されます。

前述のとおりに接続を試行しましたが、次のエラー表示されました。

 

           SQLException: Io exception : Connection refused: connect:S1000

    oracle.rdb.jdbc.common.RdbException: Io exception : Connection refused: connect

 

原因は何ですか。

 

通常、このエラーは、接続URLで指定されているノードおよびポート上でリスニング中のOracle Rdbシン・サーバーがないことを意味します。

 

そのノードでシン・サーバーが起動されており、指定されたポートでリスニングしていることを確認してください。

 

URLのノードとポートの値および構文が正しいことを確認してください。

 

先頭へ戻る

 

 

RDB--E-BAD_DB_FORMATエラーが表示されます。

 ノードおよびポートを修正し、シン・サーバーが起動済であることを確認しましたが、次のエラーが表示されます。

 

           SQLException: Io exception : Io exception : in <rdbjdbcsrv:connect>

    %RDB-E-BAD_DB_FORMAT,disk1:[jones]personnel does not reference a database known to Rdb

    -RDB-I-TEXT, %COSI-E-ERROR_TEXT, The system cannot find the file specified.

 

原因は何ですか。

 

 

エラー・メッセージが示すように、データベース・ディレクトリまたはファイル名、もしくはその両方が存在しません。

これを確認して再試行してください。

 

 

先頭へ戻る

 

 

RDB-E-AUTH_FAILエラーが表示されます。

前述の説明に従ってURLを修正しましたが、次のエラーが表示されます。

 

           SQLException: Io exception : Io exception : in <rdbjdbcsrv:connect>

    %RDB-E-AUTH_FAIL, authentication failed for user jones

 

Jonesにデータベースへのアクセス権が付与されているかどうか、および使用したパスワードが正しいかどうかを確認してください。

 

 

先頭へ戻る

 

 

“Maximum number of clients exceeded”というエラーが表示されます。

 データベースに接続できたのでアプリケーションの別のインスタンスでも試したところ、接続試行時に次のエラーが発生しました。

 

SQLException: Io exception : Io exception : Maximum number of clients exceeded

            

 

接続しようとしているシン・サーバーは、起動時に同時クライアント数の制限が設定されており、このサーバーを使用中のクライアント数がすでにその数に達しています。

          

時間をおいて再試行するか、使用可能な別のRdbシン・サーバーを試してください。

 

 

 

先頭へ戻る

 

 

“Software caused connection abort”というエラーが表示されます。

シン・ドライバを使用してデータベースに接続し、いくつかのデータベース操作を正常に実行しました。しかし、その次のリクエストを発行したところ、次のエラーが表示されました

 

  SQLException: Connection lost : Software caused connection abort: recv failed

 

最も可能性が高い原因は、接続先サーバーが制御ユーザーによって停止されたことです。使用可能な別のRdbシン・サーバーへの接続を試してください。

 

 

 

先頭へ戻る

 

 

 

シン・サーバーの停止方法を教えてください。

 

対話的にサーバーを起動した場合は、CONTROL-Yを使用して停止できます。 その後、DCL停止コマンドを発行してJavaプロセスを正常に終了させる必要があります。

 

コントローラを使用してサーバーを停止することもできます。 ただし、停止するにはサーバーの制御パスワードを入力する必要があります。 詳細は、『Oracle JDBC for Rdbユーザーズ・ガイド』を参照してください。

 

 

 

先頭へ戻る

 

 

 

ノード上でいくつかのシン・サーバーを起動しましたが、そのうちの空いている1つにアプリケーションを接続しようと思います。アプリケーションから各シン・サーバーに順番に接続していく以外の方法を教えてください。

 

この目的に使用できるのがOracle Rdbシン・プール・サーバーです。    プール・サーバーを使用すると、アプリケーションがプール・サーバーに関連付けられている単一のノード/ポートへの接続をリクエストでき、サーバー・プール内の、次に空いたシン・サーバーに自動的にリダイレクトされます。

 

先頭へ戻る

 

 

シン・プール・サーバーの起動方法を教えてください。

 

Oracle JDBC for Rdbシン・プール・サーバーは、インストール・キットに同梱されているRDBTHINSRVPOOL.JARに含まれています。

                     

シン・プール・サーバーを起動するには、単純に次の手順を行います。

 

  1. 使用できるシン・サーバーのプールを指定した構成ファイルを作成します。
  2. サーバー・プールに含めるシン・サーバーを起動するか、プールされる各サーバーの自動起動オプションを有効にします。
  3. デフォルトをjarファイルを含むディレクトリに設定し、使用する構成ファイルを指定した後で、RDBTHINSRVPOOL jarを起動します。

          

次に例を示します。

                     

           $java -jar rdbthinsrvpool.jar –cfg myconfigfile.xml

 

使用できる構成ファイルの形式は2つありますが、より多くのオプションを使用できるXML形式の構成ファイルを使用することをお薦めします。

 

現在は、Oracle JDBC for RdbコントローラまたはOracle SQL/Servicesマネージャを使用してサーバーを起動することもできます。

詳細は、『Oracle JDBC for Rdbユーザーズ・ガイド』を参照してください。

 

 

先頭へ戻る

 

 

使用可能なサーバーのプールを増やすためにプール・サーバーをカスケードできますか。

 

はい。プール・サーバーは、別のプール・サーバー内のプールされたサーバーとして使用できます。  プール・サーバーのリダイレクションには深さの制限はありませんが、深さを増やすとクライアントの接続にかかる時間も増えます。

 

プール・サーバーをプールされたサーバーとして使用する場合は、プール内でプール・サーバー同士が相互に指定する無限再帰を発生させないように注意してください。プール・サーバー操作には、このような再帰のチェック機能は装備されていません。

 

 

先頭へ戻る

 

前のバージョンのOracle JDBC for Rdbドライバでは、標準の構成ファイルを使用していました。これらのファイルはまだサポートされていますか。

はい。標準のJAVAプロパティ・ロード・ファイルである“.cfg”ファイルは、現在もサポートされています。 

 

ただし、XML形式の構成ファイルを使用してサーバーおよびセッションの構成オプションを指定すると、より多くのオプションを使用できます。新しい構成ファイルの使用を検討してください。

 

 

先頭へ戻る

 

シン・サーバーの構成ファイルには何が含まれているのですか。

 

シン・サーバーの構成ファイルには、サーバーで使用できる様々な構成オプションが含まれています。 

認識される構成ファイルの形式は、次の2つです。

 

§        標準のJAVAプロパティ・ロード・ファイル

§        XML形式ファイル

 

RDBJDBC_USERGUIDEファイルには、これらの構成オプションの詳細および構成ファイルの使用方法が記載されています。

 

次の例は、シン・プール・サーバーで使用されるXML形式の構成ファイルの内容を示しています。

 

<?xml version = '1.0'?>

<!-- Configuration file for Rdb Thin JDBC Drivers and Servers -->

<config>

    <!-- SERVERS -->

    <servers>

        <!-- DEFAULT server characteristics-->

        <server

             name="DEFAULT"

             type="RdbThinSrv"

             url="//localhost:1880/"

             maxClients="-1"

             srv.bindTimeout="0"

             srv.idleTimeout="0"

             srv.mcBasePort="5518"

             srv.mcGroupIP="239.192.1.2"

             autoStart="false"

             controlUser="jdbc_user"

             controlPass="0x811B15F866179583EB3C96751585B843"

             cfg=" rdb$jdbc_coms:my_rdbjdbccfg.xml"

             srv.execStartup="rdb$jdbc_home:rdbjdbc_startexec.com"

             srv.startup="rdb$jdbc_home:rdbjdbc_startsrv.com"

             srv.onStartCmd=”rdb$jdbc_coms:my_startsrv.com"

        />

        <!-- now the specific servers that will be started up by pool server -->

        <server

             name="rjs1"

             type="RdbThinSrv"

             url="//localhost:1880/"

             autoStart="true"

       />

        <server

             name="rjs2"

             type="RdbThinSrv"

             url="//localhost:1882/"

             autoStart="true"

             maxClients="10"

       />

        <server

             name="rjs3"

             type="RdbThinSrv"

             url="//localhost:1883/"

             autoStart="true"

             maxClients="10"

       />

 

<!-- Pool Server -->

        <server

            name="rdbpool"

            type="RdbThinSrvPool"

            url="//localhost:1890/" >

            <pooledServer name="rjs1"/>

            <pooledServer name="rjs2"/>

            <pooledServer name="rjs3"/>

        </server>

 

 </servers>

      </config>

 

 

先頭へ戻る

 

 

シン・プール・サーバーを起動する前に、プールされているシン・サーバーを明示的に起動する必要はありますか。

 

必ずしも必要というわけではありません。 シン・プール・サーバーを起動すると、そのプール内のサーバーがチェックされ、“autostart”が有効化されているすべてのサーバーが自動的に起動します。

 

さらに、プールされているサーバーがプール・サーバーによって自動的に起動され、プール・サーバーが停止すると自動的に終了します。

 

プールされている、“autostart”が有効でないサーバーをプールで使用できるようにするには、明示的に起動する必要があります。

 

 

先頭へ戻る

 

 

シン・プール・サーバーを起動する前に、すべてのシン・サーバーを起動しておく必要はありますか。

 

いいえ。 シン・プール・サーバーは、そのプール内の各サーバーの可用性をポーリングして、空きサーバーが検出された場合のみ、クライアント・アプリケーションをリダイレクトします。

 

 

先頭へ戻る

 

 

サーバー・プールから空きサーバーにアクセスする方法を教えてください。

 

アクセスするには、シン・サーバーに接続する場合と同様にシン・プール・サーバーに接続します。

 

たとえば、シン・プール・サーバーを使用して空いているシン・サーバーを選択し、MYDBNODEシステム上のdisk1:[jones]にあるpersonnel.rdbに接続するとします。

 

      Connection conn = DriverManager.getConnection

          ("jdbc:rdbThin://MYDBNODE:1702/disk1:[jones]personnel", "jones", "mypassword");

 

その後、1702でリスニングするシン・プール・サーバーによって、使用可能なシン・サーバーに接続がリダイレクトされます。

 

 

先頭へ戻る

 

 

 

プール・サーバーの操作は接続プーリングと同じですか。

 

違います。プール・サーバーの操作はサーバー・プーリングであり、接続プーリングではありません。  サーバー・プーリングでは接続は再利用されません。

 

 

先頭へ戻る

 

 

シン・プール・サーバーを介してサーバーにアクセスしようとすると、“No Rdb Thin Server currently available”というメッセージが表示されます。

 

このメッセージは、アクセスを試みたシン・プール・サーバーのサーバー・プール内に、現時点で使用可能なシン・サーバーがないことを示しています。  プールされているすべてのサーバーが最大クライアント・レベルを超えたか、現在アクティブなシン・サーバー・プロセスがありません。

 

 

 

先頭へ戻る

 

 

 OracleJDBC for Rdbシン・サーバーを使用していますが、なぜかクライアントが途中終了してしまいます。  この問題の詳しい情報を知りたいのですが。

 

終了時のエラー状態で問題を特定できない場合は、クライアント・アプリケーションまたはシン・サーバー・アプリケーション、もしくはその両方でトレースを有効にすることができます。

 

トレース・フラグの詳細は、RDBJDBC_USERGUIDEファイルのトレースに関する項を参照してください。

 

値-1を使用してトレースを有効化すると、クライアントおよびサーバーのプロセスの状況が詳細に示されます。

 

 

トレース・レベルを-1に設定した場合のクライアント側のトレースは次のようになります。

 

 

>> main 2004-08-18 14:58:09.968 : ThinConnect@fe64b9.connect( "localhost", 1701 )

>> main 2004-08-18 14:58:10.078 : ThinConnect@fe64b9.connect(

  "jdbc:rdbThin://localhost:1701/mf_personnel@tracelevel=-1@os=NT", {port=1701, servertype=RdbThinSrv, node=localhost, tracelevel=-1,

database=mf_personnel, prefix=jdbc:rdbThin:, conntype=1} )

>> main 2004-08-18 14:58:10.093 : Connection@1abab88.<init>( "mf_personnel", "jdbc:rdbThin://localhost:1701/mf_personnel@tracelevel=-1" )

Java memory in use = 440984

>> main 2004-08-18 14:58:10.140 : oracle.rdb.jdbc.rdbThin.Rdb@cdedfd.setTraceLevel( -1 )

>> main 2004-08-18 14:58:10.140 : ThinConnect@fe64b9.setTraceLevel( -1 )

>> main 2004-08-18 14:58:10.140 : ThinConnect@fe64b9.setTraceLevel msg : rdbNativeInstance=71301:20040818

>> main 2004-08-18 14:58:10.140 : ThinConnect@fe64b9.setTraceLevel msg : rdbServerInstance=71301:20040818

before connect Java memory in use = 442560

>> main 2004-08-18 14:58:10.171 : oracle.rdb.jdbc.rdbThin.Rdb@cdedfd.getRdbHandle(  )

>> main 2004-08-18 14:58:10.187 : Client@1c39a2d.flush msg : Connect send>>>>>>>>>>>>>

Data length:92

0: 00 01 82 ba 0b 9c 23 08 00 17 65 3a 5c 72 65 67

80: ff ff ff ff 00 00 00 03 00 00 00 01

response time : 0ms

SQLException: SQLState(S1000) vendor code(99035)

oracle.rdb.jdbc.common.RdbException: Maximum number of clients exceeded

        at oracle.rdb.jdbc.common.Client.Connect(Client.java:257)

        at oracle.rdb.jdbc.rdbThin.Rdb.Connect(Rdb.java:682)

        at oracle.rdb.jdbc.common.Connection.<init>(Connection.java:298)

        at oracle.rdb.jdbc.common.ThinConnect.connect(ThinConnect.java:219)

        at oracle.rdb.jdbc.rdbThin.Driver.connect(Driver.java:133)

        at java.sql.DriverManager.getConnection(DriverManager.java:512)

        at java.sql.DriverManager.getConnection(DriverManager.java:140)

        at oracle.rdb.rsql.rSQL.init(rSQL.java:214)

        at oracle.rdb.rsql.rSQL.main(rSQL.java:120)

          

サーバー側では次のようになります。

 

>> RDB$CLIENT_ID_00000002 2004-08-18 14:58:10.078 : srv.DBActionHandler@18385e3.handleActions msg : driver time : 0

>> RDB$CLIENT_ID_00000002 2004-08-18 14:58:10.078 : srv.DBActionHandler@18385e3.doAction( "INIT_V713" )

>> RDB$CLIENT_ID_00000002 2004-08-18 14:58:10.078 : srv.DBActionHandler@18385e3.doAction msg : >> send buff size = 8192

>> RDB$CLIENT_ID_00000002 2004-08-18 14:58:10.078 : srv.DBActionHandler@18385e3.Flush msg : INIT_V713 send>>>>>>>>>>>>>

Data length:8

0: 00 00 00 01 0b 9c 23 08

>> RDB$CLIENT_ID_00000002 2004-08-18 14:58:10.187 : srv.DBActionHandler@18385e3.handleActions msg : driver time : 0

>> RDB$CLIENT_ID_00000002 2004-08-18 14:58:10.187 : srv.DBActionHandler@18385e3.doAction( "CONNECT" )

>> RDB$CLIENT_ID_00000002 2004-08-18 14:58:10.187 : srv.DBActionHandler@18385e3( "Client connecting mf_personnel as murray" )

>> RDB$CLIENT_ID_00000002 connect  msg :  to > mf_personnel

>> RDB$CLIENT_ID_00000002 connect  msg :  as > murray

>> RDB$CLIENT_ID_00000002 2004-08-18 14:58:10.187 : srv.DBActionHandler@18385e3.Flush msg : CONNECT send>>>>>>>>>>>>>

Data length:12

0: 00 00 00 03 00 00 00 01 ff ff ff fe

SQLException: SQLState(S1000) vendor code(99035)

>>*RDB$CLIENT_ID_00000002 2004-08-18 14:58:10.328 : oracle.rdb.jdbc.common.RdbException: Maximum number of clients exceeded

oracle.rdb.jdbc.common.RdbException: Maximum number of clients exceeded

        at oracle.rdb.jdbc.srv.DBActionHandler.doAction(DBActionHandler.java:473)

        at oracle.rdb.jdbc.srv.ActionHandler.handleActions(ActionHandler.java:333)

        at oracle.rdb.jdbc.srv.ClientHandler.run(ClientHandler.java:203)

        at java.lang.Thread.run(Thread.java:536)

>> RDB$CLIENT_ID_00000002 2004-08-18 14:58:10.328 : srv.DBActionHandler@18385e3.FlushErr msg : CONNECT send>>>>>>>>>>>>> Maximum number of clients exceeded

Data length:48

0: ff fe 7d 25 00 05 53 31 30 30 30 00 23 4d 61 78

16: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63

32: 6c 69 65 6e 74 73 20 65 78 63 65 65 64 65 64 20

>> RDB$CLIENT_ID_00000002 2004-08-18 14:58:10.328 : srv.DBActionHandler@18385e3( "Client terminating" )

>> RDB$CLIENT_ID_00000002 2004-08-18 14:58:10.328 : srv.DBActionHandler@18385e3.forceDisconnect( "<FORCED DISCONNECT>" )

>> RDB$CLIENT_ID_00000002 2004-08-18 14:58:10.343 : srv.ClientHandler@6e3d60.run msg : bind time : total = 297 this = 297 average =148

>> RDB$CLIENT_ID_00000002 2004-08-18 14:58:10.343 : srv.ClientHandler@6e3d60.run msg : db operation time total = 952 this = 0 average = 476

 

           注意:

tracelevel=-1を使用すると、特に大量のレコードが転送される場合には、大きいログ・ファイルが作成されます。

 

これらのログで提供される情報が問題の特定につながる可能性があります。場合によっては、Oracleサポート・サービスにログのコピーを送るよう求められます。

 

注意:

    

 

組織外へログを転送する場合は、あらかじめ機密データを削除しておいてください。

 

 

先頭へ戻る

 

 

RdbJdbcCheckup.java以外にも、基本的なJDBC操作の手順を示すJavaソースのサンプルはありますか。

Web上、および専門の書店で購入できる多数の本に、JDBCの詳細な説明が含まれています。   多数のJDBC操作のコード部分やヒントも記載されています。

 

次に、personnelに含まれる従業員名を表示する単純なJavaアプリケーションを示します。 

          

使用するシステムにあわせて、引用符で囲まれているユーザー名およびパスワードを置き換え、URLを変更する必要があります。

 

 

           import java.sql.*;

 

    public class emp

    {

      public static void main(String[] args)

      {

         Connection         conn   = null;

         Statement          stmt   = null;

         ResultSet          rs      = null;

 

         try

         {

            System.out.println("Connecting to Employees");

            DriverManager.registerDriver(new oracle.rdb.jdbc.rdbThin.Driver());

   

            conn = DriverManager.getConnection (

"jdbc:rdbThin://localhost:1701/personnel",

                 "****USER****", "***PASSWORD***");

            stmt = conn.createStatement();

            rs = stmt.executeQuery(

"select first_name, last_name from employees");

            System.out.println("Employees Names");

            while (rs.next())

            {

               System.out.println(rs.getString(1) + " " + rs.getString(2)) ;

            }

            rs.close();

            stmt.close();

            conn.close();

 

         }

         catch (SQLException sqle)

         {

           System.out.println("SQL Exception " + sqle.getMessage());

           sqle.printStackTrace();

         }

         catch (Exception e)

         {

           System.out.println("Exception " + e.getMessage());

           e.printStackTrace();

               }

      }

 

           } // end of class emp

 

 

先頭へ戻る

 

 

SELECT文を実行しようとするたびに-COSI-F-CREATERRが表示されます。

 

 

この問題は、Oracle JDBC for RdbドライバのV7.1.3リリースのBETA-1でのみ発生します。

 

コントローラからシン・サーバーを起動した場合、またはエグゼキュータ・プロセスがマルチ・プロセス・サーバーによって起動された場合には、現行のプロセス環境の一部が新しいプロセスにコピーされません。

 

これらのプロセスは独立したプロセスなので、Oracle Rdb環境がプロセスに対して正しく設定されていることを確認することが重要です。

 

たとえば、環境に対して正しいバージョンのOracle Rdbが設定されていること(Oracle Rdbサイトの複数のバージョンを実行する場合)や、ソート作業ファイルを記述するためのSYS$SCRATCHが設定されていることなどを確認する必要があります。

 

また、Oracle Rdbの内部的用途のための作業ファイル作成が必要な場合もあります。通常、これらの作業ファイルはユーザーのログイン・ディレクトリに置かれます。ただし、場合によっては、サーバーとその連結解除されたエグゼキュータ・プロセスから書込みが可能な、既知のディレクトリにこれらの作業ファイルをリダイレクトする必要が生じる場合もあります。 

 

次に示すのは、Rdbが自身の作業ファイルを記述できない場合などに表示されるエラー・タイプの例です。

 

>>*RDB$CLIENT_ID_00000002 main1 2004-10-20 20:26:31.612 : java.sql.SQLException: in <rdbjdbcsrv:open_cursor>

%RDB-F-SYS_REQUEST, error from system services request

-COSI-F-CREATERR, cannot create file

-RMS-F-DEV, error in device name or inappropriate device type for operation

 

 

回避策として、環境を正しく設定し、適切なディレクトリを指定するSYS$SCRATCHおよびRDMS$BIND_WORK_FILEを定義する、DCLコマンド・プロシージャを作成します。

 

DEFAULTサーバーまたは特定の各サーバーのサーバー定義内のsrv.onStartCmdスイッチおよびsrv.onExecStartCmdスイッチを使用して、このコマンド・プロシージャを指定できます。

 

 

my_start.com

 

$ @sys$share:rdb$setver 7.1

$ DEFINE SYS$SCRATCH MY_DISK:[SCRATCH]

$ DEFINE RDMS$BIND_WORK_FILE MY_DISK:[SCRATCH]

 

 

 

使用するXMLベースの構成ファイルには、次のような内容が含まれます。

 

   <servers>

        <!-- DEFAULT server characteristics-->

        <server

             name="DEFAULT"

             type="RdbThinSrv"

  cfg="my_dir:my_rdbjdbccfg.xml"

             srv.execStartup="rdb$jdbc_home:rdbjdbc_startexec.com"

             srv.startup="rdb$jdbc_home:rdbjdbc_startsrv.com"

             srv.onStartCmd="@my_dir:my_start.com"

             srv.onExecStartCmd="@my_dir:my_start.com"

        />

 

 

 

 

先頭へ戻る

 

 

 

Oracle JDBC for Rdbコントローラ

 

Oracle JDBC for Rdbコントローラとは何ですか。

Oracle JDBC for Rdbコントローラはコマンドラインベースのユーティリティで、Oracle JDBC for Rdbサーバーでのメンテナンス操作の実行を可能にします。

 

このユーティリティを使用して、起動、停止、オープン、クローズおよびサーバーに関する情報の表示を行えます。

接続されているクライアントの表示および停止も行えます。

 

詳細は、『Oracle JDBC for Rdbユーザーズ・ガイド』を参照してください。

 

 

 

Oracle Rdbユーザー用Oracle JDBC for Rdb

Oracle JDBC for Rdbドライバで使用できるSQL構文に制限はありますか。

あります。  Oracle JDBC for Rdbドライバでは、動的SQL文で使用可能な構文であるSQL構文のみを使用できます。    

 

また、JDBC標準で指定されているエスケープ処理もサポートされており、CALL文やリテラル日付などのJDBC標準仕様を使用できます。

 

 

先頭へ戻る

 

 

 従来のように、JDBCインタフェースを使用して'CREATE TABLE'などのDDL(データ定義言語)文を使用できますか。

はい。DDL文を含め、有効な動的SQL文はすべて使用できます。

 

JDBCでは、標準のDDL構文が指定されず、表作成や索引付けなどを行うためのメソッドも提供されないため、これらの操作を実行するには、これまでのように標準のOracle Rdb SQL DDL文を使用する必要があります。

 

これらの操作では結果セットが戻されないため、DDL文にResultSet.executeUpdate()またはResultSet.execute()を使用する必要があります。

 

DDL文は、プリコンパイルされた文でも使用できます。

 

 

先頭へ戻る

 

前述のエスケープ処理とは何ですか。

 

JDBCでは、JDBC準拠のドライバがこれらの操作について同じ構文を理解できるように、SQL CALL文や日付/時間リテラルなどを標準的な方法で指定できる、標準のエスケープ構文が指定されます。

 

その後、ドライバによって、エスケープされたSQL構文がデータベース・システム固有のSQL構文に変換されます。

 

たとえば、JDBC標準形式の日付リテラルをRdb DATE ANSIまたはDATE VMSフィールドの検索フィールドとして使用することを指定するには、次のような文を発行します。

          

           stmt.execute("select * from dated_invoices where invoice_date = {d '2003-02-30'}");

 

エスケープする構文は中括弧'{}'で囲みます。

          

標準のOracle Rdb ANSIまたはVMSの日付リテラルのかわりにこの形式を使用することで、様々なJDBCドライバでのSQL文の移植性が向上します。

 

また、正しいJDBCエスケープ構文を使用するとほとんどのJDBCドライバで認識される、標準のXOPEN関数も多数あります。

 

たとえば、次の数値関数はJDBC標準によって指定されています。

 

 

 

Oracle Rdbでは、必要な関数のほとんどが直接処理されますが、一部の関数については、追加のオブジェクトをデータベースで定義する必要があります。

 

OCI Services for Oracle Rdb(前の名前はSQL*Net for Rdb)をSQL/Servicesと併用すると、これらの多くの関数を提供するために使用できる、SQLスクリプトおよび共有イメージが提供されます。 これらの関数の多くを提供するために使用できるSQL_FUNCTIONSスクリプトの詳細は、SQL*Net for Rdbのドキュメント、特に、『Guide to SQL*Net for Rdb』のデータベースの準備に関する項を参照してください。

 

次に示すDatabaseMetaDataメソッドを使用すると、現在サポートされている関数を確認できます。

 

 

          

これらのメソッドは、接続されているデータベース内で現在サポートされている関数名のリストを戻します。   これらのメソッドによって戻される関数のリストは、SQL_FUNCTIONSスクリプトで検出された追加の関数をデータベースに追加したかどうかによって異なります。

            

これらの関数および残りのエスケープ構文の詳細は、Sun JAVAのWebサイトまたはJDBC関連の本の中で探すことができます。

 

 

先頭へ戻る

 

 

Rdb対応の対話型SQLでは、表の表示を実行してデータベース内の表を確認できます。JDBCを使用して同じことができますか。

Oracle Rdbでは、SHOW文は対話型SQLのみで使用でき、JDBCからOracle Rdbに渡されたSQL文では使用できません。

          

ただし、JDBCのDatabaseMetaDataクラスでは、Oracle Rdbデータベースからのメタデータに関する情報を取得できる、いくつかのメソッドが提供されます。

          

たとえば、次のDatabaseMetaData.getTables()メソッドを使用すると、データベース内のユーザー表のリストを含む結果セットを取得できます。

 

 

               String types[] = {"TABLE", "VIEW"};

         Connection  conn = DriverManager.getConnection (

                 "jdbc:rdbThin://localhost:1701/personnel",

                 "****USER****", "***PASSWORD***");

 

         DatabaseMetaData dbmd = conn.getMetaData();

         ResultSet rs = dbmd.getTables("","", "%" , types);

 

 

getTables()メソッドの使用方法の詳細は、JDBCのドキュメントを参照してください。

 

DatabaseMetaData.getTableTypes()を使用すると、getTable()メソッド・コールで使用できる、Oracle Rdbで認識される表タイプのリストが戻されます。

 

現在Rdbで認識される表タイプは次のとおりです。

 

 

 

先頭へ戻る

 

 

  "SHOW TABLE EMPLOYEES"などを実行するにはどうしたらよいですか。

 

表に関する情報の取得には、DatabaseMetaDataクラスを使用できます。

 

単一のDatabaseMetaDataメソッドでは、対話型SQLのSHOW TABLE文のようにすべての情報は戻されません。そのため、必要な情報に応じて複数のメソッドを使用する必要があります。

 

DatabaseMetaDataでgetColumns()メソッドを使用すると、指定された表の列の詳細が戻されます。

 

次に例を示します。

 

ResultSet rs = dbmd.getColumns("","", "EMPLOYEES%" , "%");

 

 

注意:

3番目および4番目のパラメータは表名および列名で、完全一致ではなくパターンを要求します。  そのため、LIKE文と同様にパターンを使用して、検索する表名と列名の組合せを指定する必要があります。

 

 

getIndexInfo()メソッドを使用すると索引情報を取得できます。

                     

           ResultSet rs = dbmd.getIndexInfo("","","EMPLOYEES",false,false);

   

 

他にも、その他の情報の取得に使用できるDatabaseMetaDataメソッドがあります。 詳細は、JDBCのドキュメントを参照してください。

 

 

先頭へ戻る

 

無効な操作という例外が表示されます。

使用しているJavaコードでは、表に行を挿入するための多数のSQL文が発行されますが、最後にCOMMITを実行しようとすると次のメッセージが表示されます。

 

           SQLException: Invalid operation when autoCommit enabled   :S1000

 

原因は何ですか。

 

JDBC接続では、autoCommitがデフォルトでオンに設定されています。これは、すべてのSQL文がデフォルトでコミットされることを意味します。

 

autoCommitが有効化されている場合は、COMMITコマンドまたはROLLBACKコマンドを明示的に発行できません。

 

トランザクションの完了を制御する必要がある場合は、autoCommitをオフにする必要があります。

 

次に例を示します。

 

           conn.setAutoCommit(false);

 

autoCommitを有効化すると、ほとんどのトランザクションにかかる時間が非常に短くなり、結果的にデッドロックの可能性が低くなります。

          

ただし、autoCommitによってトランザクションの数および頻度が増えるため、Rdbがこれらのトランザクションを処理することで追加のオーバーヘッドが発生します。このオーバーヘッドは、個別の更新、挿入および削除が大量に実行される場合に著しく増大します。

 

このようなシナリオでは、autoCommitをオフにしてトランザクションを明示的にコミットすることをお薦めします。

 

 

先頭へ戻る

 

 

JDBCを使用する場合に、Oracle Rdbのデバッグ・フラグを使用して問合せの戦略などを確認できますか。

はい。SQL文でSET FLAGScommandを使用できます。

 

 

           stmt.execute("set flags 'strategy'");

 

 

注意:

Oracle JDBC for Rdbシン・サーバーを介して接続している場合は、現時点ではデバッグ・フラグはシン・サーバー・プロセスのコンテキストのみで機能します。そのため、デフォルトでは、デバッグ出力は、定義されているRDMS$DEBUG_FLAGS_OUTPUTに書き込まれるか、定義されていない場合はシン・サーバー・プロセスに対して定義されているSYS$OUTPUTに書き込まれます。

 

 

 

先頭へ戻る

 

問合せに対してOracle Rdbによって戻される行数を制限するために、これまでどおりSELECT文でLIMIT TO句を使用できますか。

 

はい。Oracle Rdbの問合せでは従来どおりLIMIT TOを使用できます。

 

さらに、Statement.setMaxRows()メソッドを使用して、ResultSetによって戻される行数を制限することもできます。

LIMIT TO句とStatement.setMaxRows()メソッドの両方を使用して制限値を設定した場合は、戻されるレコード数の制限値が小さい方の値に設定されます。