よくある質問

すべて開く すべて閉じる
  • 19cの新機能

    2022年1月5日更新

    最新情報については英語Oracle JDBC FAQページも参照してください。

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

    下のセクションでは、19cの主要なJDBC機能について説明します。詳細は、「RDBMSesを使用するJavaアプリケーションのパフォーマンスとスケーラビリティの改訂」を参照してください。

    • 最新のJava規格JDBCドライバ: ojdbc10.jar(19cのみ)およびojdbc8.jar)とUniversal Connection Pool(ucp.jar)により、JDBC 4.3およびJDBC 4.2に準拠し、JDK11、JDK10、JDK9、JDK8をサポート

    • 接続: TCPS接続と接続プロパティの受渡しを容易にするためのEasy Connect Plus(19cのみ)、接続プロパティを設定するための新しいojdbc.propertiesファイル、TNS_ADMINを設定するための複数の方法、サーバーのドメイン名(DN)証明書を接続プロパティとして設定する機能、新しいウォレット・プロパティ(my_wallet_directory)のサポート
    • パフォーマンス: データをOracle Database(21c以降)にストリーミングするためのReactive Streams Ingest(RSI)、トラフィック・ディレクター・モード(CMAN-TDM)のOracle接続マネージャー(CMAN)
    • 高可用性: 透過的アプリケーション・コンティニュイティ(TAC)、DRCPでのACサポート、および具体的なJavaクラスとして実装されたレガシーOracle JDBCタイプのACサポート
    • スケーラビリティ: Oracle RACデータ・アフィニティ、および中間層用のシャード・ルーティングAPI
    • セキュリティ: OraclePKIProviderの自動プロバイダ解決、キー・ストア・サービス(KSS)のサポート、およびHTTPSプロキシのサポート
    • データ型: PL/SQLの連想配列へのアクセス性、INバインドパラメータとしてのOracle REF CURSOR、JSONデータ型の検証
  • Java開発者用のドキュメントに関連するOracle Database Cloud Serviceの有無

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

JDBCの概要

  • JDBCとは何ですか。

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

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

    —JDK 11におけるさまざまなJDBC仕様(4.3、4.2、4.2など)の概要について詳しくは、 java.sql を参照してください。

    jcp.orgにある完全なJDBC仕様を参照してください。

  • JDBCの詳細はどこから入手できますか。

    オラクルのJDBCドライバのページをまず参照してください。詳しい内容については、JDBC開発者ガイドおよびJDBC Githubをご覧ください。

    JDBCに関する文献も多数あります。JDBC APIチュートリアルとリファレンス(第3版)から始めることをお薦めします。

  • Javaの詳細はどこから入手できますか。

    OracleのJavaサイトをまず参照するとよいでしょう。

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

リリース固有の質問

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

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

    リリース 利用開始(GA)日 Premier Supportの期限 Extended Supportの期限 Sustaining Supportの期限
    21c (Innovation Release) 2021年8月 2024年4月 設定なし 無期限
    19c (長期サポート・リリース) 2019年4月 2024年4月 2027年4月 無期限
    18c 2018年7月 2021年6月 設定なし 無期限
    12.2 2017年3月 2020年11月30日(制限付きエラー修正期間12.2.0.1 - 2020年12月1日- 2022年3月31日) 設定なし 無期限
    EE 12.1 2013年6月 2018年7月 2021年7月 無期限
  • JDBCとRDBMSの相互運用性マトリックスまたは認証マトリックスとはどのようになっていますか。

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

    相互運用性マトリックス Database 21.1 Database 19.x Database 18.3 Database 12.2 および 12.1
    JDBC 21.x はい はい はい はい
    JDBC 19.x はい はい はい はい
    JDBC 18.x はい はい はい はい
    JDBC 12.2 and 12.1 はい はい はい はい
  • Oracle JDBCのリリースとJDKのバージョンの関連について教えてください。

    Oracle JDBCドライバの最新リリースは、常に最新バージョンのJDKに対応しています。JDBCドライバの一部のバージョンでは、複数のバージョンのJDKをサポートしています。ご希望のJDKバージョンに適したJDBCドライバを選択するには、以下の表を参照してください。

    Oracle Databaseのバージョン リリース固有のJDBC jarファイル
    23.x ojdbc11.jar (JDK11、JDK17、JDK19およびJDK21)
    ojdbc8.jar (JDK8、JDK11)
    21.x ojdbc11.jar (JDK11、JDK17およびJDK19)
    ojdbc8.jar (JDK8、JDK11)
    19.x ojdbc10.jar (JDK11およびJDK17)
    ojdbc8.jar (JDK8、JDK11、JDK17およびJDK19)
    18.x ojdbc8.jar (JDK8、JDK11)
    12.2 または12cR2 ojdbc8.jar (JDK8)
    12.1 または12cR1 ojdbc7.jar(JDK 7、JDK 8)
    ojdbc6.jar(JDK 6)
    11.2 または11gR2 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のリリースとJDKの仕様の関連について教えてください。

    この表には、Oracle JDBCドライバと、そのリリースでサポートされるJDBCの仕様が記載されています。

    Oracle Databaseのバージョン JDBC仕様の準拠
    23.xおよび21.x ojdbc11.jarのJDBC 4.3
    ojdbc8.jarのJDBC 4.2
    19.x ojdbc10.jarのJDBC 4.3
    ojdbc8.jarのJDBC 4.2
    18.3 ojdbc8.jarのJDBC 4.2
    12.2 または12cR2 ojdbc8.jarのJDBC 4.2
    12.1 または12cR1 ojdbc7.jarのJDBC 4.1
    ojdbc6.jarの JDBC 4.0
    11.2 または11gR2 ojdbc6.jarのJDBC 4.0
    ojdbc5.jarのJDBC 3.0
  • JDK11とともに使用する推奨の19.x JDBCドライバを教えてください。

    バージョン19.xには、
    (a) ojdbc8.jar (JDK8 (JDBC 4.2)とコンパイルされ、JDK9、JDK11と使用可能)、および
    (b) ojdbc10.jar (JDK10(JDBC 4.3)とコンパイルされ、JDK11と使用可能)があります。
    JDK11を使用している場合、Oracleの拡張機能を除く4.3のすべての機能を備えているojdbc8.jarが最善の選択肢です。標準Java SEで使用可能なJDBC 4.3機能が必要なお客様のみ、ojdbc10.jarを使用してください。
    例:
    ojdbc8.jar:
    Connection conn = DriverManager.getConnection(. . .);    // conn.beginRequest(); would fail because beginRequest is not in Java 8  ((OracleConnection)conn).beginRequest(); // succeeds because beginRequest is provided as an Oracle extension

    ojdbc10.jar:
    Connection conn = DriverManager.getConnection(. . .);  conn.beginRequest(); // succeeds because beginRequest is in Java 10        ((OracleConnection)conn).beginRequest(); // succeeds because OracleConnection supports JDBC 4.3 (in Java 10) and beginRequest is part of JDBC 4.3
  • 上の表に記載されていないJDBCバージョンについて教えてください。

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

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

    必要なJDBC jarファイルおよび orai18n.jar, oraclepki.jar, osdt_core.jar, osdt_cert.jarといったその他の関連jarファイルは、Oracle Technology NetworkのJDBCダウンロード・ページからダウンロードしてください。

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

    JDBCドライバについて詳しくは、下の表を参照してください。

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

Oracle JDBCの概要

  • オラクルが提供するJDBCドライバにはどのようなものがありますか。

    オラクルでは、異なる導入シナリオで使用する場合に対応するために、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リスナーで構成する必要があります。ほとんどの新機能はJDBC Thinドライバでのみ開発されているため、オラクルのすべてのお客様には、JDBC Thinドライバを使用することを推奨します。すべてがJavaで記述されているため、ドライバはプラットフォームに依存しません。
    • JDBC Thinサーバー側ドライバ: これは別のJDBC TYPE 4ドライバであり、Javaを使用してOracleに直接接続されます。このドライバは、Oracleデータベースの内部で使用されます。また、このドライバではクライアント側JDBC Thinドライバと同じ機能が提供されますが(上を参照)、Oracleデータベースの内部で実行され、リモート・データベースにアクセスするのに使用されます。すべてがJavaで記述されているため、ドライバはプラットフォームに依存しません。
    • JDBC OCIクライアント側ドライバ: これはJDBC TYPE 2ドライバであり、Javaネイティブ・メソッドを使用して基本Cライブラリ内でエントリ・ポイントがコールされます。このCライブラリはOCI(Oracle Call Interface)と呼ばれており、Oracleデータベースとやり取りします。JDBC OCIドライバでは、ドライバと同じバージョンのOracleクライアント・インストールが必要です。

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

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

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

    最適な選択肢は、Oracle JDBC Thinドライバです。新たな拡張機能や新機能はすべて、JDBC Thinドライバにのみ実装されています。

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

    データベース・セッション内のインプレース処理(データベースでのJavaなど)では、組込みType 2ドライバ(またはサーバー内部ドライバ)のいずれかを使用する必要があります。セッションで実行中のJavaコードが、リモートのOracleデータベースまたは同じデータベース・インスタンス内の別のセッションにアクセスする必要がある場合は、組込みType 4ドライバ(またはサーバーThinドライバ)を使用する必要があります。

  • サーバーThinドライバおよびサーバー内部ドライバ用のjarファイルについて教えてください。

    これらのドライバは両方ともにOracleサーバーJava VMでのみ実行され、VMのインストールの一部としてクラスがインストールされます。これらのドライバに対して必要で使用可能な別のクラス・ファイルは存在しません。参考までにInternalT2Driver.javaおよびInternalT4Driver.javaを確認してください。

  • サード・パーティ・ベンダーは、Oracle JDBCドライバと自社のソフトウェアを同時に配信できますか。

    サード・パーティ・ソフトウェア企業(およびOracleパートナー)は、FUTCライセンスを確認し、法務部門が本契約を履行してください。詳しくは、最寄りのオラクル販売代理店までお問い合わせください。

  • Oracle JDBCドライバが必要とするのはどの権限ですか。

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

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

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

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

インストール

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

    ご使用のJDKバージョンに適合するOracle JDBCドライバをダウンロードします。JDBCドライバの最新バージョンは、ダウンロード・ページから入手できます。classpathにJDBCドライバを必ず含めてください。「ダウンロード・ページにある複数のJARファイルの違いについて教えてください。」を参照して、必要なファイルを判断してください。

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

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

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

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

DriverManagerおよびDataSource

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

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

    DataSourceには、Connectionを作成するためのさらに柔軟性の高い方法が備えられています。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);
     
     
  • どの接続プールを使用すればよいですか。

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

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

    Oracle Implicit Connection Cacheのサポートは終了しています。11.1では、古い接続キャッシュOracleConnectionCacheImplのサポートは終了しています。

  • JDBC OCI接続プーリングとは何ですか。

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

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

接続

  • 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接続ではない場合)、データベース記述は次のいずれかになります。

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

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

    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 JBDC開発者ガイド』で定義されています。

  • クラス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メモリー管理』を参照してください。

  • サービス接続文字列とは何ですか。

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

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

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

    例:

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

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

  • 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(操作不可)に設定されます。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文字 32,766文字 直販  
                 
    すべて SQL クライアント 32,767文字 2,147,483,647バイト ストリーム  
    すべて SQL クライアント 2,147,483,648バイト 2,147,483,647文字 一時CLOB  
    CHAR   サーバー 1文字 65,536バイト 直販 1, 2
    NCHAR     1文字 4,000バイト 直販  
    NCHAR     4,001バイト 2,147,483,647文字 一時CLOB  
    CHAR     65,537バイト 2,147,483,647バイト ストリーム  
          2,147,483,647バイト 2,147,483,647文字 一時CLOB  
                 
    すべて PL/SQL すべて 1文字 32,512文字 直販  
    すべて PL/SQL すべて 32,513文字 2,147,483,647文字 一時CLOB  
  • setBytesとsetBinaryStreamを使用する際のバイナリ・データのサイズ制限はどれくらいですか。
    Stmt ドライバ 下限 上限 バインド・メカニズム
    すべて すべて すべて 0 0 null  
    すべて SQL クライアント 1文字 32,766文字 直販  
                 
    すべて SQL クライアント 32,767文字 2,147,483,647バイト ストリーム  
    すべて SQL クライアント 2,147,483,648バイト 2,147,483,647文字 一時CLOB  
    CHAR   サーバー 1文字 65,536バイト 直販 1, 2
    NCHAR     1文字 4,000バイト 直販  
    NCHAR     4,001バイト 2,147,483,647文字 一時CLOB  
    CHAR     65,537バイト 2,147,483,647バイト ストリーム  
          2,147,483,647バイト 2,147,483,647文字 一時CLOB  
    すべて PL/SQL すべて 1文字 32,512文字 直販  
    すべて PL/SQL すべて 32,513文字 2,147,483,647文字 一時CLOB  

    注:

    以下で置き換えることができます。

    begin Insert into blob_tab (blob_col) values (? ); end;

    1. サーバー側内部ドライバでは、SQL文のBLOBパラメータに対して2,000バイトより大きいデータは変換できません。PL/SQL文では、この制限は存在しません。このことは、PL/SQLでSQLを折り返すことにより、多くのケースで回避策として使用される場合があります。例:Java文字列insert into blob_tab (blob_col) values (?)
    2. 代替の回避策として、Oracle固有のメソッドsetBytesForBlobが使用される場合があります。
  • oracle.jdbc.OraclePreparedStatementにおける独自のメソッドsetBytesForBlob、setStringForClobのサイズ制限はどれくらいですか。
    API FORM Stmt ドライバ 下限 上限 バインド・メカニズム
    setBytesForBlob なし すべて すべて 0 0 null  
        すべて クライアント 1バイト 2,000バイト 直販  
        すべて クライアント 2,001バイト 21,474,836,487バイト 一時BLOB 2
    setStringForClob すべて すべて すべて 0 0 null  
      すべて すべて クライアント 1文字 32,766文字 直販  
      すべて すべて クライアント 32,767文字 2,147,483,647文字 一時CLOB  
      すべて すべて サーバー 1文字 4,000バイト 直販  
      すべて すべて サーバー 4,001バイト 2,147,483,647文字 一時CLOB 1

    注:

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

    はい。

  • IN OUTパラメータを指定した CallableStatementsとプロシージャについて教えてください。

    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句の要素に対するバインド・パラメータがサポートされていないことです。これは、ドライバではなくデータベースに関する制限事項です。

ResultSets

  • "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を利用する汎用コードが含まれているため、必ずしも使用できるとは限りません。
    • V8CompatibleConnectionプロパティを設定する。この設定によりJDBCドライバに対して、新しいマッピングではなく古いマッピングを使用するよう指示されます。このフラグは、ConnectionプロパティまたはSystemプロパティのいずれかとして設定できます。Connectionプロパティを設定するには、DriverManager.getConnectionまたはOracleDataSource.setConnectionPropertiesに渡されるjava.util.Propertiesオブジェクトを追加します。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にマッピングされるだけでなく、データベースへの書込み時にTimestampsがSQL DATEに変換されてしまいます。8iのサポートは終了しているため、11.1 JDBCドライバではこの互換性モードはサポートされていません。このため、V8CompatibleV8Compatibleのサポートは終了しています。

    上で説明したように、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 4,000バイト
    setBytes LONG RAW 2ギガバイト
    setString LONG 32,000文字(SetBigStringTryClob="false")
    4,000文字(SetBigStringTryClob="true")
    setString CLOB 20億文字

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

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

  • TIMESTAMP WITH TIME ZONEの読取り結果が異なるのはなぜですか。

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

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

    データベースでの読取り時刻が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データベースは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の挿入より遅いですか。

    モデルによって異なります。10,000よりも小さい値を書き込む場合は、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型とは何ですか。

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

Row Sources

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

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

    • オブジェクト作成プロパティ
    • ランタイム・プロパティ

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

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

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

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

Thinドライバ

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

    はい。Javaアプリケーションの開発にJDBC Thinドライバが使用できます。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ドライバを使用する必要があります。

エラー

  • DriverManager.getConnectionで、"適切なドライバがありません"というエラーが出ます。

    ドライバが登録され、お使いのJDBCドライバに一致する接続URLを使用していることを確認してください。正しい値を確認するには、「OracleのJDBCドライバの使用」を参照してください。

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

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

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

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

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

    依存関係にあるDLLのリストは、Windows ExplorerプログラムでDLLを右クリックし、「Quick View」を選択すると参照できます。Quick View画面には、依存関係のあるDLLを記載したImport Tableが表示されます。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つの接続で、1つのクライアントが同時にオープンできるカーソルの数は制限されています(デフォルト値は50)。カーソルをクローズしたり解放したりするには、stmt.close()メソッドを使用して明示的に文をクローズする必要があります。

    こうしたカーソルを明示的にクローズしないと、最終的にこのエラーが表示されます。"OPEN_CURSORS"の上限の値を増やせば、一時的にこの問題を回避できますが、根本的な解決になりません。不要になったカーソルは明示的にクローズする必要があります。

  • エラー・メッセージ:"ORA-01002: fetch out of sequence"

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

    したがって、AutoCommitをfalseに設定すれば解決します。

  • エラー・メッセージ:"ORA-12705: invalid or unknown NLS parameter value specified"

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

  • エラーORA-12705でテキストを取得し直そうとしているときに表示されるエラー

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

    このエラーは、クライアントをインストールしたものの、ORACLE_HOMEを設定し忘れている場合に表示されることがあります。ORACLE_HOME環境変数を設定していない場合は、この環境変数を設定/エクスポートするだけで問題が解決します。クライアント側での再インストールは不要です。

  • エラー・メッセージ:JDBC ThinドライバでUnicodeのリテラルに"invalid character"エラーが発生する

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

    ResultSet rset = stmt.executeQuery ("select * from \"\u6d82\u6d85\u6886\u5384\"");

  • INSERTまたはUPDATEのオペレーションが遅い

    デフォルトでは、文を実行するとすぐに、ドライバはすべてのINSERTとUPDATEをコミットします。これはJDBCのautoCommitモードと呼ばれます。autoCommitをオフにして、明示的なコミット文を使用する方がパフォーマンスが良くなります。autoCommitをオフにするには、ConnectionクラスのsetAutoCommit: エントリポイントを使用します。

    connection.setAutoCommit(false); INSERTおよびUPDATEへのコールをバッチ処理するためのOracleの拡張機能については、JDBCドキュメントで更新のバッチ処理について確認してください。これらのコマンドをバッチ処理すると、autoCommitをオフにするよりもさらにスピードが上がります。これらのコマンドをバッチ処理すると、autoCommitをオフにするよりもさらにスピードが上がります。

  • エラー・メッセージ:"Connection reset by peer"

    このエラーは通常、サーバーへの接続中にそのサーバーがクラッシュすると表示されます。接続を確立するプロセスの最中であったり、確立された接続につながろうとしている途中であったりするかもしれません。どちらにしても、サーバー側のログ・ファイルを見て、サーバーにどのようなエラーとスタック・ダンプがスローされているかを確認してください。

    これは、間違ったポートや無効なポート(マシンにの場合もある)に接続しようとした際に表示されるエラーとは異なります。そのような場合はこのエラーではなく、別のエラーが表示されます。また、サーバーがダウンして、接続リクエストに応答できない場合に表示されるエラーとも異なります。

  • "Protocol Violation"とはどのような意味ですか。

    ThinドライバがRDBMSから想定外のものを読み取ると、この例外がスローされます。これは、Thinドライバのプロトコル・エンジンと、RDBMSのプロトコル・エンジンが同期されていないという意味です。このエラーを解決する方法はありません。接続が無効になっています。接続を閉じる必要がありますが、おそらくそれも失敗します。

    再現可能なテスト・ケースでこのエラーが生成される場合は、TARファイルをオラクル・グローバル・サポートにお送りください。JDBCドライバとRDBMSの具体的なバージョン番号(すべてのパッチを含む)を明記してください。

デモ・プログラム

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

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

  • デモの実行方法を教えてください。

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

  • デモ実行時にエラーが発生した場合はどうすればよいですか。

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

    • classpath
    • 正しいJDKバージョンであること
    • 予備テストの要件について、Samples-Readme.txt, Makefile,、および各.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トレース機能を有効にする方法を教えてください。

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

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

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

  • JDBCドライバはファイアウォールとともに動作しますか。

    はい。JDBC OCIドライバとJDBC Thinドライバは両方ともに、イントラネット設定およびエクストラネット設定で動作できます。これらのドライバはエクストラネット導入環境では、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 Collections、および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では、oracle.sql.ROWIDと完全に互換性があり、JSE 6 (ojdbc6.jar)ドライバでサポートされる java.sql.Rowidが定義されています。

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

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

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

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

    Oracle JDBCドライバでは、REFCURSOR型のバインド変数がサポートされています。REFCURSORは、JDBC ResultSetによって表されます。CallableStatementのgetCursorメソッドを使用して、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ファイルを使用する必要があります。JDBCドライバojdbc8.jarには、ロギング・コードは含まれていません。非デバッグDMS jarファイルojdbc8dms.jarには、何らかのロギング・コードが含まれています。デバッグjarファイル*_g.jarには、さまざまなロギング・コードが含まれています。classpathには、必要以上の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」を超える設定にすると、ディスク領域がいっぱいになるまでログ・ファイルに保存されます。この場合、警告が通知されます。

  • サーバー側内部ドライバについて教えてください。

    サーバー側内部ドライバでは、トレース出力にjava.util.loggingが使用されます。サーバーにある便利な

    OracleLog.propertiesファイルを使用するには、次を実行します。

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

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