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をサポート
JDBCドライバまたはUCP(あるいはその両方)を使用するJava開発者の場合、クラウドのデータベース・サービスに接続する際の詳細な手順は、DBC with DB Cloudのページに記載されています。
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 Githubをご覧ください。
JDBCに関する文献も多数あります。JDBC APIチュートリアルとリファレンス(第3版)から始めることをお薦めします。
OracleのJavaサイトをまず参照するとよいでしょう。
Javaに関する文献も多数あります。代表的な文献は、次のとおりです。
サポートされている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月 | 無期限 |
サポートされる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に対応しています。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ドライバと、そのリリースでサポートされる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 |
バージョン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
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 jarファイルおよび orai18n.jar, oraclepki.jar, osdt_core.jar, osdt_cert.jar
といったその他の関連jarファイルは、Oracle Technology NetworkのJDBCダウンロード・ページからダウンロードしてください。
JDBCドライバについて詳しくは、下の表を参照してください。
オラクルでは、異なる導入シナリオで使用する場合に対応するために、4種類のJDBCドライバを提供しています。すべてのOracle JDBCドライバは類似していますが、JDBC OCIドライバのみが利用できる機能もあれば、JDBC Thinドライバのみが利用できる機能もあります。
ネイティブ・メソッドを使用することにより、JDBC OCIドライバ・プラットフォームが固有のものになります。Oracle製品では、Solaris、Windows、その他多数のプラットフォームがサポートされています。
このJDBC OCIドライバは、OCI Instant Client機能によるインストールに使用できます。この際、完全なOracleクライアント・インストールは必要ありません。詳しくは、Oracle Call Interfaceを参照してください。
最適な選択肢は、Oracle JDBC Thinドライバです。新たな拡張機能や新機能はすべて、JDBC Thinドライバにのみ実装されています。
TCP/IP以外のネットワークを使用する場合は、OCIドライバを使用する必要があります。
データベース・セッション内のインプレース処理(データベースでのJavaなど)では、組込みType 2ドライバ(またはサーバー内部ドライバ)のいずれかを使用する必要があります。セッションで実行中のJavaコードが、リモートのOracleデータベースまたは同じデータベース・インスタンス内の別のセッションにアクセスする必要がある場合は、組込みType 4ドライバ(またはサーバーThinドライバ)を使用する必要があります。
これらのドライバは両方ともにOracleサーバーJava VMでのみ実行され、VMのインストールの一部としてクラスがインストールされます。これらのドライバに対して必要で使用可能な別のクラス・ファイルは存在しません。参考までにInternalT2Driver.javaおよびInternalT4Driver.javaを確認してください。
サード・パーティ・ソフトウェア企業(およびOracleパートナー)は、FUTCライセンスを確認し、法務部門が本契約を履行してください。詳しくは、最寄りのオラクル販売代理店までお問い合わせください。
アプリケーションがSecurityManagerを有効にして実行されている場合(本番環境の必要あり)、特定の操作に権限が付与されます。この操作を実行するには、コードに適切な権限を付与する必要があります。
付与する権限を見つける方法としては、ダウンロード・ページのファイル ojdbc.policyをご覧ください。これは、ドライバに対して必要な権限をすべて付与できる、汎用セキュリティ・ポリシー・ファイルです。たいていの場合、アプリケーションではこれらの権限を必要とする機能を使用しないため、多くの権限をコメント・アウトする必要があります。
このファイルは、多数のSystemプロパティの内容に応じて異なります。このファイルを使用するには、 java
コマンドで-Dオプションを指定してプロパティを定義する必要があります。
JDBCドライバ・コードにのみ付与する必要がある権限もあります。これらの権限が必要な操作は、doPriviliged
ブロックに含まれています。その他の権限は、ドライバをコールするコードにも付与する必要があります。この操作は doPriviliged
ブロックには含まれていません。注目すべき1つの例は、Thinドライバを使用して接続をオープンする場合には、コードをコールする際にソケットをオープンする権限が必要であることです。これにはいくつかの理由がありますが、特に不正コードによるDoS攻撃にドライバが使用されないようにすることが目的です。
ご使用のJDKバージョンに適合するOracle JDBCドライバをダウンロードします。JDBCドライバの最新バージョンは、ダウンロード・ページから入手できます。classpathにJDBCドライバを必ず含めてください。「ダウンロード・ページにある複数のJARファイルの違いについて教えてください。」を参照して、必要なファイルを判断してください。
通常、JDBC OCIドライバでは、ドライバと同じバージョンのOracleクライアント・インストールが必要です。ただし、JDBC OCIドライバは、OCI Instant Client機能とともに使用でき、その際、完全なOracleクライアント・インストールは必要ありません。OCI Instant Clientインストールに関するドキュメントを参照してください。
その必要はありません。これら2つのドライバは、データベース・インストールの一部としてインストールされます。データベースがJavaサポートによりインストールされている場合、これら2つのドライバはすでにインストールされており使用できます。「いずれかのクラス・ファイルをOracleサーバーJava VMにロードできますか。」を参照してください。
最初のバージョンの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機能が用意されています。
Oracle Implicit Connection Cacheのサポートは終了しています。11.1では、古い接続キャッシュOracleConnectionCacheImplのサポートは終了しています。
JDBC OCIConnectionPoolは、データベースへの基本物理接続を備えた複数のステートフル・セッションのプーリングに使用されます。接続は、コール期間だけセッションにバインドされます。プール要素は基本物理接続です。アプリケーション・セッションは、使用可能な基本物理接続に移行できます(内部的)。
プールの各物理接続には、サーバーへの追加内部セッションが含まれています。そのため、サーバーでは多数のセッションが確認できます。
URLの一般的な形式は、次のとおりです。
jdbc:oracle:<drivertype>:<username/password>@<database>
<drivertype>
thin
OCI
kprb
<username/password>
は空にするか、次の形式にします。
<username>/<password>
このようなURLでは
ユーザー名とパスワードは空として指定されていますが、URL
jdbc:oracle:thin:@mydatabase
では、ユーザー名とパスワードは指定されていません。この形式を使用する際には、ユーザー名とパスワードを他の何らかの方法で指定する必要があります。
<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開発者ガイド』で定義されています。
OracleDriver
をDriverManager
に登録しなくてもよいですか。サーバー側内部ドライバと接続する際に、OracleDriver
クラスを登録する必要はありません。ただし、登録しても問題はありません。これは、getConnection()
またはdefaultConnection()
のどちらを使用して接続を確立する場合に当てはまります。
ojdbc6.jarおよびJSE 6以降を使用する場合は、ドライバの種類に関係なくドライバを登録する必要はありません。JSE 6の時点では、標準のJavaサービス・プロバイダ・インタフェースにより自動的にドライバが登録されます。DriverManager.getConnection
をコールすると、ランタイムによりドライバが検出されて登録されます。
URL文字列で指定したユーザー名とパスワードは、デフォルトのサーバー接続では無視されます。DriverManager.getConnection()
メソッドをコールするたびに、新しいJava Connection
オブジェクトが返されます。このメソッドでは新しいデータベース接続は作成されませんが(単一の暗黙的接続のみを使用)、新しいjava.sql.Connectionオブジェクトが返されます。
また、JDBCコードがターゲット・サーバー内部で実行されている場合、接続はクライアントからの明示的接続インスタンスではなく、暗黙的データ・チャネルとなります。接続はクローズしないでください。
この解決策は、メモリ割当てプールの起動サイズ(-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ユーザー・ガイド』を参照してください。
この処理を実行する唯一の方法は、接続時にユーザー名とパスワードを文字列として指定するのではなく、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管理者ガイド』の"パスワード・ファイルの作成とメンテナンス"を参照してください。
JDBC OCIドライバでは、データベース・サーバーと同じアルゴリズムがサポートされています。
11.1と11.2の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を参照してください。
はい。ただし、サポートはドライバ固有です。SSL暗号化は、Oracle JDBC 9.2.x以降のJDBC OCIドライバでサポートされており、10.2以降ではThinドライバでサポートされています。
はい。はい。JDBC Thinドライバでは、たとえば、LDAPプロバイダとしてOracle Internet Directoryを使用する際、接続URLにおいて通常のLDAPとSSLを介したLDAPの両方がサポートされています。詳しくは、『Oracle Database JDBC開発者ガイド』と『Oracle Database Net Services管理者ガイド』を参照してください。
通常は、Oracle Connection Managerを使用して、ファイアウォール経由で接続をプロキシすることを推奨します。Oracle Connection Managerで使用されるように指定されたポートをオープンし、残りを処理します。データベース・リスナーによって使用されるポート(ポート1521など)を直接にはオープンしないでください。
Oracle Connection Managerの構成方法については、『Oracle Database Net Services管理者ガイド』を参照してください。
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ドライバとサーバー側内部ドライバの場合は変換されます。
OracleConnectionのプロパティ'CONNECTION_PROPERTY_PROCESS_ESCAPES'を使用してください。
はい。はい。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
)のパラメータ名を使用してバインドされます。これは非常に異なる点で、得られる結果も大幅に異なる場合があります。
通常、各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ロケータのみが格納されている表から個別に格納され、ロケータが表の列に格納される前に別の操作としてサーバーに送信されます。
形式 | 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 |
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;
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 |
注:
はい。
IN OUT
パラメータを指定した CallableStatements
とプロシージャについて教えてください。INおよびOUTパラメータのデータ型を同一にするのが1つの要件です。自動スイッチングを使用する際は、ユーザー・コードのregisterOutParameterで型を変更しないと競合が発生します。適切な手法は、この問題を引き起こす可能性のあるIN OUTパラメータを使用しないことです。これを実行するには元のプロシージャを変更し、個別のINおよびOUTパラメータが使用されるラッパー・プロシージャまたはPL/SQLブロックを追加します。
はい。はい。このことをPL/SQLコードで利用する可能性について検討してください。
既存のコードは、引き続き正常に動作します。ただし、変更点が1つあります。以前は、入力のサイズが使用されているAPIの制限値を超えると、setXXX APIのコール時にSQLExceptionがスローされていました。現在では、例外がある場合は実行時に発生します。
はい。LOBは、文の次回の実行後または文がクローズされたときに解放されます。
はい。はい。ただし、最大サイズであると仮定した最長の文字列に対して、CLOBに切り替える場合を除きます。
最初の段階で、巨大な文字列を作成するのは適切であるとは言えません。非常に大規模なオブジェクトがJavaメモリ管理システムに与える影響については、Java仮想マシン・ベンダーのドキュメントを参照してください。
LONG RAW
および LONG
列タイプは非推奨です。この場合、setXXXStream
APIの新しく使用するのはなぜですか。Stream APIは非推奨ではありません。このAPIは、一部の操作においてLOB APIよりも優れたパフォーマンスを達成するため、存続される予定です。
もちろんです。LOB APIを使用すると、LOBの任意の部分にランダムにアクセスできます。必要に応じて、このAPIを使用することを検討してください。
select * from tab where id in (?, ?, ?, ...)
を実行するPreparedStatementを作成できないのはなぜですか。問題になるのは、RDBMSではIN句の要素に対するバインド・パラメータがサポートされていないことです。これは、ドライバではなくデータベースに関する制限事項です。
このエラーが発生するのは、ResultSetをクローズした後に使用を試みた場合です。また、ResultSetを作成した文をクローズした場合にも発生します。
ResultSet rset = stmt.executeQuery ("select ROWID from EMP"); ... rset.close (); // or stmt.close (); rset.getString (1);
元の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データ型がサポートされていなかったため、DATE
をTimestamp
にマッピングすることに関して問題はありませんでした。
9.2 では、RDBMSにTIMESTAMP
のサポートが追加されました。DATE
とTIMESTAMP
の違いは、TIMESTAMP
にはナノ秒が含まれていますが、DATE
には含まれていないということです。そのため、9.2以降では、DATE
がDate
に、TIMESTAMP
がTimestamp
マッピングされています。ただし、時刻情報を含めるためにDATE
値を利用していた場合は、問題が発生します。
9.2以降10.2までのドライバでは、この問題に対処するために次のいくつかの方法が用意されています。
DATE
の代わりにTIMESTAMP
を使用するように変更する。これはかなりまれなケースと考えられますが、最適な解決策です。defineColumnType
を使用して列を定義する際に、DATE
としてではなくTIMESTAMP
として定義するように変更する。必要ない限り、実際にdefineColumnType
を使用することはないため、この場合には問題が発生します(「defineColumnType
どういうもので、いつ使用すればよいですか。を参照)。getObject
の代わりにgetTimestamp
を使用するよう変更する。可能な場合、これは適切な解決策です。ただし、多くのアプリケーションにはgetObject
を利用する汎用コードが含まれているため、必ずしも使用できるとは限りません。V8Compatible
Connectionプロパティを設定する。この設定によりJDBCドライバに対して、新しいマッピングではなく古いマッピングを使用するよう指示されます。このフラグは、ConnectionプロパティまたはSystemプロパティのいずれかとして設定できます。Connectionプロパティを設定するには、DriverManager.getConnection
またはOracleDataSource.setConnectionProperties
に渡されるjava.util.Properties
オブジェクトを追加します。Systemプロパティを設定するには、java
コマンドラインで-D
オプションを指定します。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ドライバではこの互換性モードはサポートされていません。このため、V8Compatible
V8Compatibleのサポートは終了しています。
上で説明したように、11.1ドライバではデフォルトで、データベースからの読取り時にSQL DATEがTimestamp
に変換されます。これは常に正しい処理でしたが、9iでの変更時に誤りが発生していました。11.1ドライバでは正しい動作に戻されています。アプリケーションでV8Compatible
を設定していない場合でも、たいていの場合動作に違いはありません。getObjectを使用してDATE
列を読み取る際に、違いに気付く可能性があります。結果は、Date
ではなくTimestamp
になります。Timestamp
はDate
のサブクラスであるため、通常この点は問題になりません。違いに気付く可能性があるのは、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ドライバではこのバグは修正されています。
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
メソッドをサポートすることはできません。
CLOBのセグメントを"消去"するだけです。CLOBの長さを短くは*しません*。このため、CLOBの長さは消去の前後で同じです。CLOBの長さを短くするには、DBMS_LOB.TRIMを使用します。
はい。使用できますが、位置と長さの引数が正しいことを確認する必要があります。また、推奨のOutputStreamインタフェースを使用して、次にputCharsをコールすることもできます。
JDBCではCLOBは*常に*USC2に置かれていますが、これはJava "char"型に対応するOracleキャラクタ・セットです。このため、OCI CLOB CharSetIdに同等なものは存在しません。
モデルによって異なります。10,000よりも小さい値を書き込む場合は、LONG RAWの方が高速です。大きい値を書き込む場合は、違いがなくなります。
これは正しい動作です。LONG列はインプレース(別名インロー)では'フェッチ'されません。この列はアウトオブプレースでフェッチされ、明示的に読み取るまでパイプ内に置かれます。この場合はLobLocatorを取得(getBlob())し、LONG列を読み取る前にこのLOBの長さの取得を試みます。パイプは空でないため、上の例外が発生します。解決策は、BLOBで何らかの操作を実行する前に、LONG列の読取りを完了することです。
Oracle LOBでは、値セマンティクスが使用されています。LOBを更新する際には、LOBをデータベースに書き戻して変更内容を確認する必要があります。技術的な理由により、LOBを書き込んでいないときでも変更内容が保存される場合があります。ただし、この現象がいつ発生するのかは予測できないため、必ずLOBを書き込む必要があります。
以前は可能でしたが、その後可能ではなくなりました。現在、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); } }
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);
TOPAQUE型にはバイナリ・データと、サーバー・ネイティブ・コード・ライブラリで定義されるサポート・メソッドが含まれています。これらは、オラクル社内でのみ使用可能です。
Beanのプロパティは、次のように分類できます。
オブジェクト作成プロパティはオブジェクトの作成前に設定する必要がある、オブジェクト作成に関する主要なプロパティです。ランタイム・プロパティは常時設定することができ、実行時にBeanの動作を変更するためのプロパティです。
スクロール可能性、ユーザー名、パスワードはすべて、オブジェクト作成プロパティです。自動コミット、ステータス、プリフェッチ・カウントなどはすべて、ランタイム・プロパティです。通常、バックグラウンド・オブジェクトはexecute/setCommand時に有効になるため、すべての文作成属性はその前に設定する必要があります。このため、Statement URL、ユーザー名、パスワードなどを作成するには接続オブジェクトが必要であり、コマンドを設定する前に設定する必要があります。
はい。シリアライズ可能なストリームを使用することにより、フラット・ファイルやネットワーク接続などのシリアライズ可能メディアのストリーム・オブジェクトをシリアライズできます。この機能はCachedRowSetにのみ適用されます。JDBCドライバが存在する1台のマシン上でCachedRowSetを作成し、ドライバ・バイナリではなくRowSetバイナリのみが存在するリモート・クライアントに対して、そのCachedRowSetを移動することが可能です。リモート・クライアントは、RowSetを挿入、削除、または更新することにより変更できます。次に、そのCachedRowSetをJDBCドライバとRowSetバイナリが存在する場所に戻し、変更した値をデータベースに同期させます。
はい。Javaアプリケーションの開発にJDBC Thinドライバが使用できます。ThinドライバはJDBC OCIドライバとは異なり、TCP/IPベースのネットワークでのみ動作します。TCP/IP以外のネットワークでアプリケーションを実行しているユーザーに対しては、JDBC OCIドライバを使用することを推奨します。
サーバー内部ドライバは、Javaストアド・プロシージャ内のデータベースにアクセスする際に使用します。Javaストアド・プロシージャは、PL/SQLがRDBMSで実行されるのと同様に、Oracle RDBMSの内部で実行されるJavaメソッドです。これはRDBMSで実行されるため、データベース・セッションで実行する必要があります。サーバー内部ドライバ接続は、そのデータベース・セッションへのハンドルです。このため、コードがJavaストアド・プロシージャで実行されており、データベースにアクセスする必要がある場合は、サーバー内部ドライバを使用します。ただし、サーバーThinドライバを使用する必要があるようなまれなケースは除きます。
通常、サーバー内部ドライバはJavaストアド・プロシージャで使用します。このドライバは、ストアド・プロシージャが実行されているのと同じセッションに接続されます。ただし、場合によっては、別のデータベースまたは同じデータベース内の新しいセッションに接続する必要が生じます。これら2つのケースでは、サーバーThinドライバを使用する必要があります。
ドライバが登録され、お使いのJDBCドライバに一致する接続URLを使用していることを確認してください。正しい値を確認するには、「OracleのJDBCドライバの使用」を参照してください。
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"をインストールしてください。
Oracle7クライアント・インストールでOCI8ドライバを使用しています。OCI7ドライバを使用してください。
1つの接続で、1つのクライアントが同時にオープンできるカーソルの数は制限されています(デフォルト値は50)。カーソルをクローズしたり解放したりするには、stmt.close()メソッドを使用して明示的に文をクローズする必要があります。
こうしたカーソルを明示的にクローズしないと、最終的にこのエラーが表示されます。"OPEN_CURSORS"の上限の値を増やせば、一時的にこの問題を回避できますが、根本的な解決になりません。不要になったカーソルは明示的にクローズする必要があります。
JDBC接続はデフォルトでAutoCommitがオンになっています。ただし、'for update'が含まれるSQLを使用するには、AutoCommitをオフにする必要があります。
したがって、AutoCommitをfalseに設定すれば解決します。
NLS_LANGを明示的に設定してください。NLS_LANGが設定されていない、または設定が正しくない場合は、クライアントがOracle7.3.4ではない可能性があります。クライアントにOracle7.3.4をインストールしてください。
クライアントにOracleがインストールされていないか、インストールが正常に完了しませんでした。まだインストールしていない場合は、通常のOracle ServerインストールCDを使用して、"Oracle Client"インストールを実行し、必要なソフトウェアをクライアント・マシンにインストールしてください。すでにインストールしている場合は、正常に完了したのかどうかを確認して、必要な場合は削除してから再インストールしてください。
このエラーは、クライアントをインストールしたものの、ORACLE_HOMEを設定し忘れている場合に表示されることがあります。ORACLE_HOME環境変数を設定していない場合は、この環境変数を設定/エクスポートするだけで問題が解決します。クライアント側での再インストールは不要です。
JDBC Thinドライバでは、Unicode文字を含むリテラルを二重引用符で囲む必要があります。例:
ResultSet rset = stmt.executeQuery ("select * from \"\u6d82\u6d85\u6886\u5384\"");
デフォルトでは、文を実行するとすぐに、ドライバはすべてのINSERTとUPDATEをコミットします。これはJDBCのautoCommitモードと呼ばれます。autoCommitをオフにして、明示的なコミット文を使用する方がパフォーマンスが良くなります。autoCommitをオフにするには、ConnectionクラスのsetAutoCommit: エントリポイントを使用します。
connection.setAutoCommit(false); INSERTおよびUPDATEへのコールをバッチ処理するためのOracleの拡張機能については、JDBCドキュメントで更新のバッチ処理について確認してください。これらのコマンドをバッチ処理すると、autoCommitをオフにするよりもさらにスピードが上がります。これらのコマンドをバッチ処理すると、autoCommitをオフにするよりもさらにスピードが上がります。
このエラーは通常、サーバーへの接続中にそのサーバーがクラッシュすると表示されます。接続を確立するプロセスの最中であったり、確立された接続につながろうとしている途中であったりするかもしれません。どちらにしても、サーバー側のログ・ファイルを見て、サーバーにどのようなエラーとスタック・ダンプがスローされているかを確認してください。
これは、間違ったポートや無効なポート(マシンにの場合もある)に接続しようとした際に表示されるエラーとは異なります。そのような場合はこのエラーではなく、別のエラーが表示されます。また、サーバーがダウンして、接続リクエストに応答できない場合に表示されるエラーとも異なります。
ThinドライバがRDBMSから想定外のものを読み取ると、この例外がスローされます。これは、Thinドライバのプロトコル・エンジンと、RDBMSのプロトコル・エンジンが同期されていないという意味です。このエラーを解決する方法はありません。接続が無効になっています。接続を閉じる必要がありますが、おそらくそれも失敗します。
再現可能なテスト・ケースでこのエラーが生成される場合は、TARファイルをオラクル・グローバル・サポートにお送りください。JDBCドライバとRDBMSの具体的なバージョン番号(すべてのパッチを含む)を明記してください。
はい。はい。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デモはエラーなく実行されるはずです。エラーが発生した場合は、現在の構成に問題がある可能性があります。以下の点を確認してください。
Samples-Readme.txt, Makefile,
、および各.javaファイルを参照していること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();をコールします。 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有効な値は次のとおりです。
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に設定します。
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
現在、Visual Cafeはサポートされていません。
現在、Visual J++はサポートされていません。
はい。Oracle JDBC OCIドライバとJDBC Thinドライバの両方で、PL/SQLストアド・プロシージャおよび無名ブロックの実行がサポートされています。また、SQL:2003エスケープ構文とOracleエスケープ構文の両方がサポートされています。次のPL/SQLコールは、両方のOracle JDBCドライバから使用できます。
はい。Oracle JDBC OCIドライバとJDBC Thinドライバの両方で、クライアントとサーバー間のいずれの方向においてもデータのストリーミングがサポートされています。また、バイナリ、ASCII、およびUnicodeのすべてのストリーム変換がサポートされています。詳しくは、Oracle JDBCドライバ・ドキュメントのストリームに関するチュートリアルを参照してください。
はい。Oracle JDBC OCIドライバとJDBC Thinドライバの両方で、マルチバイト・キャラクタ・セットがサポートされています。両方ともOracleキャラクタ・セットが使用されているデータベースにアクセスできます。また、マルチバイト・キャラクタがUnicode 1.2に変換されます。JDBC OCIドライバはこれまでテストされてきており、すべての欧州キャラクタ・セットおよびすべてのアジア・キャラクタ・セット(中国語、日本語、韓国語を含む)がサポートされています。
はい。JDBC OCIドライバとJDBC Thinドライバは両方ともに、イントラネット設定およびエクストラネット設定で動作できます。これらのドライバはエクストラネット導入環境では、SQL*Net認定済みの業界トップクラスのファイアウォールとともに使用できます。今日では、次のベンダーのファイアウォールがSQL*Netで認定済みです。
いいえ。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つのみです。
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)。
Oracle JDBCドライバでは、REFCURSOR型のバインド変数がサポートされています。REFCURSORは、JDBC ResultSetによって表されます。CallableStatementのgetCursorメソッドを使用して、PL/SQLブロックによって返されたREFCURSOR値をResultSetに変換します。JDBCにより、問合せを実行して結果セットを返すストアド・プロシージャをコールします。対応するCallableStatementをoracle.jdbc.driver.OracleCallableStatementにキャストし、getCursorメソッドを使用します。
バージョン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を参照してください。
はい。はい。SQLデータ型を表すoracle.SQL.*
クラスはすべてシリアライズ可能です。
はい。Oracle JDBCドライバではオブジェクトとコレクションがサポートされています。8.1.5以降でサポートされています。
バッチ・コール用のWaitOptionおよびAutoRollbackロールバック・オプションは非推奨であり、現在は使用できません。現在、次のメソッドは使用できません。
public void setAutoRollback (int autoRollback); public int getAutoRollback(); public void setWaitOption(int waitOption); public int getWaitOption();
はい。その場合は、Thinサーバー・ドライバを使用します。8.1.6 SDK以降でサポートされています。
この時点における唯一の既知の回避策は、2番目のインストール時にDBLINKを使用するように、最初のインストールを構成することです。このようにして、JDBCドライバに対してまだ同じ1つのインスタンスで動作していると偽の判断をさせたうえで、DBLINKを利用して詳細な部分に対処します。ただし、MTSサーバー・インストールでDBLINK使用に関する問題が発生していると誤って推測されます。
それはモデルによって異なります。Thinドライバの方が高速なアプリケーションもあれば、OCIドライバの方が高速なアプリケーションもあります。10.1.0の時点では、おそらくThinドライバの方がOCIドライバよりも多少高速です。クライアントとサーバーのハードウェアとOSが同じタイプの場合、Thinドライバの方が高速である一方、OCIドライバではRDBMSへの負荷が多少減少します。通常その差は小さく、10%未満です。大部分のお客様は、管理がより簡単なThinドライバを使用しています。ただし、お客様に応じて有用性は異なります。
SQLが一度だけ実行される場合は、Statementの方が多少高速であると考えられます。ただし、SQLが2度以上実行される場合は、PreparedStatementの方がかなり高速になります。ステートメント・キャッシュを使用する必要がある場合、キャッシュから文を取得するのは同じ文を実行することと同じです。
通常は、PreparedStatementを使用することを強く推奨します。特に、ユーザーがSQLで指定したデータを送信する場合がこれに該当します。データをPreparedStatementパラメータにバインドすることにより、大部分のSQL注入攻撃を回避できます。Statementを使用する際のパフォーマンス上のメリットは無視できる程度です。
最初に、ロギング・コードが含まれる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
に配置します。