Comments
Description
Transcript
Oracle Database 11gに関するJava開発者の展望
Oracle Database 11g に関する Java 開発者の展望 Oracle ホワイト・ペーパー 2007 年 6 月 ご注意: 本書は、オラクルの一般的な製品の方向性を示すことが目的です。また、情報提 供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。 下記の事項は、マテリアルやコード、機能の提供を確約するものではなく、また、 購買を決定する際の判断材料とはなりえません。オラクルの製品に関して記載さ れている機能の開発、リリース、および時期については、弊社の裁量により決定 いたします。 Oracle Database 11g に関する Java 開発者の展望 ご注意: .............................................................................................................. 1 はじめに .............................................................................................................. 3 JAVA 標準による生産性と移植性 .................................................................... 3 JDBC 4.0......................................................................................................... 3 Java 5 準拠の Oracle JVM ............................................................................. 5 サーバー・サイド JDBC に組み込まれた RowSet(JSR-114) .............. 6 Oracle から Java への公開.................................................................................. 6 SYS.ANYDATA および SYS.ANYTYPE のサポート................................ 6 セキュア・ファイルのサポート ................................................................. 6 パフォーマンスとスケーラビリティ............................................................... 7 JDBC のパフォーマンスとスケーラビリティ .......................................... 7 最初のラウンドトリップにおけるプリフェッチ – 1 日に 100 万の データベース・ラウンドトリップを削減 ........................................... 7 ネイティブの AQ プロトコル................................................................ 7 データベース変更通知および問合せ変更通知.................................... 7 サーバーおよびクライアントの結果キャッシュ................................ 7 Oracle JVM のパフォーマンスおよび JIT コンパイラ ............................. 8 セキュリティ ...................................................................................................... 8 JDBC Thin・クライアントのデータ整合性および暗号化 ....................... 8 JDBC Thin・クライアントの厳密認証....................................................... 9 OS 認証 .......................................................................................................... 9 使いやすさ ........................................................................................................ 10 JDBC のデフォルト・サービス ................................................................ 10 Oracle JVM の使いやすさ .......................................................................... 11 JDK ライクなインタフェース ............................................................. 11 プロパティのインタフェース ............................................................. 12 データベース常駐型 JAR ..................................................................... 12 2 層にわたって存続する Java セッション状態 ................................. 13 出力のリダイレクト ............................................................................. 13 管理性 ................................................................................................................ 14 プログラム的な起動と停止....................................................................... 14 Oracle JVM の JMX ..................................................................................... 14 JDBC の JMX:MBean のロギング .......................................................... 15 Oracle JVM ユーティリティの拡張機能 .................................................. 16 OJVMTC:スタンドアロンの参照リゾルバ ..................................... 16 loadjava に対する URL サポート......................................................... 16 dropjava を使用したリストに基づく操作 .......................................... 17 ojvmjava の拡張機能 ........................................................................... 17 結論 .................................................................................................................... 18 Oracle Database 11g に関する Java 開発者の展望 2 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 Oracle Database 11g に関する Java 開発者の展望 はじめに Oracle データベースは、あらゆるトランザクションおよび企業用の Java アプリ ケーションまたはフレームワークで重要な役割を果たします。Java および JDBC の新しい機能拡張は、どのようなメリットをもたらすのでしょう。このホワイト・ ペーパーでは、生産性、移植性、パフォーマンス、スケーラビリティ、セキュリ ティ、使いやすさ、および管理性の観点から、主要なメリットを紹介します。 JAVA 標準による生産性と移植性 Java を使用するおもな理由として、生産性や、プラットフォームとベンダーの枠 を超えたアプリケーションの移植性が挙げられます。本リリースでは、JDBC は、 Java SE 6、JDBC 4.0、および JMX をサポートしています。また、RDBMS に組み 込まれている Java ランタイムでは、Java SE 5、RowSet(JSR-114)、JMX をサポー トしています。 JDBC 4.0 Oracle Database 11g の JDBC には、2 つの系統があります。すなわち、Java 5(JDK 1.5)向けの ojdbc5.jar と Java 6(JDK 1.6)向けの ojdbc6.jar です。 ojdbc6.jar は、新しい JDBC 4.0 の仕様をサポートします。仕様が公開されてい るので1、このホワイト・ペーパーでは、JDBC 4.0 の包括的な説明は割愛しますが、 おもな機能を以下に記載します。 • Connection および Statement の拡張 Connection インタフェースおよび Statement インタフェースに、次の拡張がお こなわれます。 a) 接続の検証 boolean isValid (int timeout):接続がクローズされておらず、有 効な場合、このメソッドは、TRUE を返します。 b) SetClientInfo()メソッドと GetClientInfo()メソッドを使用して、 ユーザー定義の情報とプロパティを設定および取得します。 void setClientInfo(java.lang.String name, java.lang.String value) java.lang.String getClientInfo(java.lang.String name) java.util.Properties getClientInfoProperties() 1 Oracle Database 11g に関する Java 開発者の展望 http://jcp.org/aboutJava/communityprocess/final/jsr221/index.html 3 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 c) Statement をプール可能に設定 void setPoolable(boolean poolable) d) Statement オブジェクトがプール可能かどうかを確認します。 boolean isPoolable() e) 新規 Statement インタフェースおよびクラス PooledConnection における StatementEventListener インタフェースおよび StatementEvent クラス • Wrapper インタフェース Wrapper インタフェースにより、次の JDBC インタフェースへのベンダー拡 張にアクセスできます。 java.sql.Connection, java.sql.DatabaseMetaData, java.sql.ParameterMetaData, java.sql.ResultSet, java.sql.ResultSetMetaData, java.sql.Statement, javax.sql.Datasource. Wrapper インタフェースは、unwrap()メソッドを定義します。このメソッ ドは、インタフェースを引数として受け入れ、一定のインタフェースを実装 するオブジェクト(またはオブジェクトのプロキシ)を返します。返された オブジェクトは、プロキシが公開しないメソッドにアクセスするために使用 します。 isWrapperFor()メソッドは、コールするオブジェクトがインタフェースの 引数を実装する場合、true を返します。isWrapperFor()が true を返す 場合、同じ引数を使用した unwrap()の呼出しは成功します。 • 新しい標準データ型 SQL ROWID メ ソ ッ ド を マ ッ ピ ン グ す る た め の 標 準 Java タ イ プ 、 java.sql.RowId: java.sql.RowId xrowId = rs.getRowId(1); … ps.setRowId(1, xrowId); java.sql.SQLXML2:SQL XMLType データ型メソッドをマッピングするた めの標準およびドライバに依存しない Java タイプ: SQLXML … public … public … public • createSQLXML() throws SQLException; XMLStreamReader getXMLStreamReader() XMLStreamWriter putXMLStreamWriter() void setString(String text) 以下を含む SQL 2003 各国語キャラクタ・セット: NCHAR、NCLOB:setFormOfUse を使用する必要はなくなります。 NVARCHAR、LONGNVARCHAR 2 Oracle Database 11g に関する Java 開発者の展望 Oracle Database 11g Release 1 の基本リリースのあと、パッチセットで提供される予定です。 4 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 • LOB の拡張 Connection インタフェースは、空の Blob、Clob、および Nclob オブジェ クトを作成するために、createBlob メソッド、createClob メソッドと createNClob メソッドで拡張されています。 Blob aBlob = con.createBlob(); 新たに作成された Blob、aBlob にはデータが含まれていません。CLOB イン タフェース上で setXXX()メソッドを起動して、データを移入できます。 int numWritten = aBlob.setBytes(1, val); 逆に、getBlob()、getClob()、 getNclob()メソッドを使用して、LOB の値を ResultSet から取得できます。 Blob blob = rs.getBlob(1); • 例外の階層 JDBC 4.0 は、例外フレームワークの完全なネットワークに以下を提供します。 a) Java SE の For-each ル ー プ に 対 す る サ ポ ー ト : SQLException が java.lang.Iterable<Throwable>を実装するので、SQLExceptions のナビゲー ションが簡単になりました。 b) Java SE の連鎖例外に対するサポート:SQLExceptions には、1 つ以上の一 時的なリレーションシップがある場合があります。 c) 新 し い SQLException サ ブ ク ラ ス : SQLTransientException 、 SQLNonTransientException • 行セット(JSR-114)の拡張 JDBC 4.0 では、RowSet API には大幅な拡張をせず、NChar や RowId の getter/setter など、ResultSet API をわずかに変更しています。 Java 5 準拠の Oracle JVM データベースに組み込まれた Oracle Java VM(Oracle JVM)により、Java SE アプ リケーションおよびライブラリを Oracle データベースで直接実行できます。その 結果、生産性とパフォーマンスが大幅に向上します。本リリースでは、デフォル トで、Java SE 5(JDK 1.5 互換)がサポートされています。 多数の顧客が、RDBMS をアップグレードせずに、既存のデータベースの Oracle JVM をより新しい Java SE にアップグレードする必要があるといっています。本 リリースより、データベース内の Java ランタイムは、次のように多くの Java SE リリースをサポートするように調整されています。 Oracle Database 11g に関する Java 開発者の展望 • RDBMS の各リリースには、デフォルトの Java SE リリースが同梱されてい ます(たとえば、Oracle Database 11g Release 1 では Java5)。 • 新しい Java SE リリースが利用可能になり、それが主流になるにつれて、 Oracle JVM ランタイムは、追加の Java SE リリース(たとえば、Java 6、Java 7)をサポートするようになります。 5 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 Oracle JVM Statement of Direction は、まもなく Metalink および Oracle JVM ポータ ル3に掲載されます。 サーバー・サイド JDBC に組み込まれた RowSet(JSR-114) Oracle JVM には、SQL データにアクセスするために、サーバー・サイド JDBC が 組み込まれています。Oracle Database 10g Release 1 以降、クライアント・サイド Oracle JDBC では RowSet 仕様(JSR-114)が実装されています。本リリースでは、 サーバー・サイド JDBC ドライバでも、この仕様が実装されます。これにより、 JDBCRowSet、CachedRowSet、WebRowSet、JoinRowSet、FilteredRowSet を使用し ている Java/JDBC コードをデータベース内で直接実行できます。 Oracle から Java への公開 Java 標準の実装を超えて、JDBC は、Oracle データベースを Java の世界に公開し ます。本リリースより、SYS.ANYDATA、Sys:ANYTYPE、セキュア・ファイル、 および問合せ変更通知の各機能が公開されました(パフォーマンスとスケーラビ リティの項で説明します)。 SYS.ANYDATA および SYS.ANYTYPE のサポート SQL SYS:ANYDATA は多相データ型で、所定の時点に、データとともに一定の型 記述のインスタンスを格納します。時間とともに、SYS:ANYDATA 列に任意の SQL タイプ(VARCHAR、NUMBER、TIMESTAMP、FLOAT など)が含まれることが あります。さらに、ANYDATA 列は永続します。 SYS.ANYTYPE SQL タイプには、任意の SQL タイプ(オブジェクト型、集合を含 む)の型記述が含まれます。SQL タイプは一時的または永続的、名前がある場合 ま た は 名 前 が な い 場 合 が あ り ま す 。 SYS.ANYTYPE SQL タ イ プ は 、 oracle.sql.TypeDescriptor クラスにマッピングされます。 セキュア・ファイルのサポート セキュア・ファイルは、新しい Oracle データベースのデータ層であり、LOB とファ イル・システムの API です。インテリジェントな LOB 圧縮、暗号化、重複の排除、 および高機能の領域管理を実現します。Oracle JDBC は、以下を含む新しい API によってセキュア・ファイルを公開します。 oracle.sql.{BlobRegion/ClobRegion} java.sql.{ClobShare/BlobShare} oracle.sql.{setOptions/getOptions} oracle.sql.{BLOB/CLOB}.{setSharedRegions/getSharedRegions} oracle.sql.{CLOB/BLOB}.fragment{Insert/Delete/Move/Replace} oracle.sql.{CLOB/BLOB}.{open/copy/getChunkSize} 3 Oracle Database 11g に関する Java 開発者の展望 http://www.oracle.com/technology/tech/java/jsp/index.html 6 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 パフォーマンスとスケーラビリティ 本リリースでは、JDBC と Oracle JVM によって、新しいパフォーマンスおよびス ケーラビリティの機能が Java にもたらされます。 JDBC のパフォーマンスとスケーラビリティ スタンドアロンの JDBC アプリケーションと Java EE コンポーネントは、次の JDBC のパフォーマンスおよびスケーラビリティ拡張機能を使用すると、より高速 に実行されます。最初のラウンドトリップにおけるプリフェッチ、ネイティブの AQ プロトコル、データベース/問合せ変更通知、クライアント・サイド、および サーバー・サイドの結果キャッシュ。 最初のラウンドトリップにおけるプリフェッチ – 1 日に 100 万のデータ ベース・ラウンドトリップを削減 非定型の SQL 問合せでは、新しいプリフェッチ・メカニズムと解析、実行、フェッ チを組み合わせることで、データベースとの最初のやり取りで結果セットをまと めて取得します。この機能を用いた結果、信頼できる社内テストで、ネットワー ク・ラウンドトリップが 50%、応答時間が 50%、サーバーとクライアントの CPU 時間の消費量が 30%削減されました。この削減割合を 1 日(または一定期間)に 100 万の非定型問合せを発行する典型的な Web 小売りアプリケーションに適用し てみると、同じ期間に 100 万ラウンドトリップが削減されることになります。 ネイティブの AQ プロトコル JDBC 経由の JMS/AQ 呼出しに、従来の PL/SQL ベースのインタフェースに替わる 新しいネイティブ AQ プロトコルが導入され、40~300%のパフォーマンス向上と サーバーの CPU 時間消費量の削減が実現されました。 データベース変更通知および問合せ変更通知 JDBC のデータベース変更通知および問合せ通知のサポートは、スケーラブルなメ カニズムです。これにより、JDBC スレッドは問合せ結果の変更通知をサブスクラ イブできます。この機能の使用は次の手順に従っておこないます。 (i) 登録:JDBC アプリケーションは、JDBC スタイルまたは PL/SQL スタイル の登録を使用して、SQL 問合せを登録(すなわち、問合せを作成)できます。 (ii) SQL 問合せの関連づけ(表変更):SQL 問合せを登録と関連づけます。 (iii) RDBMS 通知:登録済みの問合せまたは結果セットに影響を与える DDL お よび DML が変更されると、Oracle データベースは、専用のネットワーク接続を使 用して、JDBC スレッドに通知します。ドライバは、これらの通知をアプリケーショ ンが受信した Java イベントに変換します。 中間層はこの機能を使用して、データ・キャッシュをタイミングよく無効化し、 リフレッシュできます。この API について詳しくは、Oracle Database 11g の JDBC に関するドキュメントを参照してください。 サーバーおよびクライアントの結果キャッシュ SQL 結果セットをサーバー・サイドの SGA にキャッシュして、関連するオブジェ クトが変更されたときはいつでも自動的に無効化できるようになりました。 Oracle Database 11g に関する Java 開発者の展望 7 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 OCI クライアント・スタックは、サーバー結果キャッシュをクライアント・サイ ドで実現したもので、サーバー・キャッシュに対する変更と同期しています。 Oracle JVM のパフォーマンスおよび JIT コンパイラ データベース内の Java は、Oracle8i 以降に導入され、PL/SQL および Java EE より も効率的にユーザー定義の特定のデータベース機能に対処します。ただし、まだ 十分に普及していません。その理由は、(i) pure Java の実行では、JDK VM よりも 遅いと考えられている(データベースでは SQL と Java の組合せは、より速く実行 さ れ る ) 、 (ii) 重 要 な パ フ ォ ー マ ン ス を 実 現 す る ネ イ テ ィ ブ の コ ン パ イ ラ (NCOMP)は、使い勝手が悪いので(すなわち、明示的なステップに C コンパイ ラが必要)、ほとんど使用されていない、ということです。 以前のリリースには、3 つの Java 実行モードがありました。それらは、(i) 完全な 解釈(標準)、(ii) System NCOMP(同梱されている CD からインストールした JAccelerator)、(iii) ユーザーNCOMP(完全にコンパイルされている)でした。ほ とんどの顧客は、完全な解釈のモード(システムとユーザー・クラスの両方)で Java を実行します。 Oracle Database 11g 以降では、Oracle JVM は、ジャスト・イン・タイム・コンパ イラ(JIT コンパイラ)を実現します。JIT コンパイラは、データベース内に存在 する Java クラスから、動的かつ透過的に、ネイティブ・バイナリを生成します。 生成されたバイナリ・コードは保存されるため、再コンパイルは不要です。JIT コ ンパイラはデフォルトで(インストールしただけで)有効になっており、C コン パイラや詳細な設定は必要ありません。業界標準のベンチマークを使用してオラ クルで実施したテストでは、JIT コンパイラによって生成されたバイナリによって 10 倍の実行速度が達成されました。 セキュリティ データに関していえば、セキュリティは、もっとも重要な考慮事項です。Oracle には強力なセキュリティ・プラットフォームがありますが、これは、Java アプリ ケーションにどのようなメリットをもたらすでしょう。本リリースでは、JDBC OCI に次いで JDBC Thin でも、Oracle Advanced Security オプションがサポートさ れました。オプションの内容は、強力な認証機能(Kerberos、 Radius、SSL)や、 新しい暗号方式とデータ整合性アルゴリズムのサポートなどです。 JDBC Thin・クライアントのデータ整合性および暗号化 Oracle データベースは、AES256、AES192、または AES128 暗号化アルゴリズムを サポートします。データの変更、パケットの削除、リプレイ攻撃などの攻撃から データ転送を保護するために、MD5 または SHA-1 ハッシュ・アルゴリズムを使用 した暗号化ダイジェストが、ネットワークを介して送信される各メッセージに組 み込まれています。 JDBC プログラムは、接続プロパティとして暗号化アルゴリズムおよびチェックサ ム・アルゴリズムを設定します。データベースが、このような暗号化やチェック サムを受け入れない場合、接続の試行は失敗します。 sqlnet.ora SQLNET.ENCRYPTION_TYPES_SERVER = (AES256,AES192,AES128) SQLNET.ENCRYPTION_SERVER = accepted jdbc Oracle Database 11g に関する Java 開発者の展望 8 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCR YPTION_LEVEL,AnoServices.ANO_REQUIRED); prop.setProperty( OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPES , "( " + AnoServices.ENCRYPTION_AES256 + "," +AnoServices.ENCRYPTION_AES192 + ")"); JDBC Thin・クライアントの厳密認証 厳密認証は、Oracle の認証アダプタに存在します。このアダプタによって、Kerberos、 Remote Authentication Dial-In User Service(RADIUS)、分散コンピューティング環 境(DCE)、Secure Sockets Layer(SSL)を含む、サード・パーティおよび業界標 準の認証方式がサポートされます。本リリースでは、JDBC Thin・クライアントが、 Kerberos、RADIUS、および SSL 認証をサポートします。以下の手順で設定します。 1. サード・パーティの認証サーバー(Radius、Kerberos)を構成して起動するか、 キーストアを設定します。 2. サード・パーティ認証を使用するようにデータベースを構成します。 REMOTE_OS_AUTHENT = TRUE (INIT.ORA) SQL> create user ssl_client1 identified externally as 'CN=Test Client2,C=US‘; SQL> grant create session,connect,resource to ssl_client1; 3. 適切な場合(Radius、Kerberos)、sqlnet を構成します。 sqlnet.authentication_services = (beq,kerberos5) sqlnet.authentication_kerberos5_service = dbji sqlnet.kerberos5_conf = /home/Jdbc/Security/kerberos/krb5.conf sqlnet.kerberos5_keytab = /home/Jdbc/Security/kerberos/dbji.stacv41 sqlnet.kerberos5_conf_mit = true sqlnet.kerberos_cc_name = /tmp/krb5cc_5088 4. JDBC で接続プロパティを設定します。 prop.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_A UTHENTICATION_SERVICES,"("+AnoServices.AUTHENTICATION_RADIUS+")" ); OS 認証 Oracle データベースは、クライアント認証をクライアントのオペレーティング・ システムに委任できます。これによって、ユーザーは、OS の資格証明を使用して 認証をおこない、データベースに接続できます。 1. init.ora で OS 認証を有効にします。 REMOTE_OS_AUTHENT = TRUE 2. データベース・ユーザーを作成し、OS が認証する接続を許可します。 CREATE USER ops$w_rose IDENTIFIED EXTERNALLY; GRANT CONNECT TO ops$w_rose; Oracle Database 11g に関する Java 開発者の展望 9 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 3. jdbc String url = "jdbc:oracle:thin:@stacv41.us.oracle.com:5521:dbja" Driver driver = new oracle.jdbc.OracleDriver(); DriverManager.registerDriver(driver); Properties props = new Properties(); Connection conn = DriverManager.getConnection( url, props); 使いやすさ 製品に対する支持は、使い勝手の悪さによって低下することがあります。どの機 能によって、Java 開発者は Oracle データベースを簡単かつ快適に使用できるよう になるでしょう。 JDBC のデフォルト・サービス XE リリース以降、Oracle データベースには新しい接続機能が組み込まれています。 一定の条件の下では、Oracle データベース接続アダプタには、データベースがイ ンストールされたコンピュータのホストのみが必要です。その結果、JDBC 接続 URL の構文の一部がオプションになります。 jdbc:oracle:driver_type:[username/password]@[//]host_name[:port][:ORCL] 上記の URL で o //はオプションです。 o port はオプションです。 デフォルトの Oracle Net リスナー・ポート(1521)が使用されない場合のみ、ポー トを指定します。 o :ORCL(またはサービス名)はオプションです。 Oracle データベース・クライアントの接続アダプタは、ホスト上でデフォルト・ サービスに接続します。このデフォルト・サービスは、listener.ora ファイル で ORCL に設定されています。 以下の例では、listener.ora ファイルの基本的な構成を示します。デフォルト・サー ビスは、このファイルで定義されます。 例 3-2 listener.ora のデフォルト・サービスの構成 MYLISTENER = (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=test555)(PORT=1521)) ) DEFAULT_SERVICE_MYLISTENER=dbjf.regress.rdbms.dev.testserver.com SID_LIST_MYLISTENER = (SID_LIST= (SID_DESC=(SID_NAME=dbjf)(GLOBAL_ DBNAME=dbjf.regress.rdbms.dev.testserver.com)(ORACLE_HOME=/test/ora cle)) ) 次のコマンドでリスナーを再起動します。 > lsnrctl start mylistener 次の URL は、この構成で動作します。 jdbc:oracle:thin:@//test555.testserver.com jdbc:oracle:thin:@//test555.testserver.com:1521 jdbc:oracle:thin:@test555.testserver.com jdbc:oracle:thin:@test555.testserver.com:1521 jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test555 .testserver.com )(PORT=1521))) jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test555 .testserver.com )))jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCO L=TCP)(HOST=test555.testserver.com )(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=))) Oracle Database 11g に関する Java 開発者の展望 10 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 注:デフォルト・サービスは、Oracle Database 11g Release 1 の新機能です。Oracle データベース・クライアントのほかのバージョンを使用してデータベースに接続 している場合は、SID とポート番号を指定する必要があります。 Oracle JVM の使いやすさ データベースでの Java の普及を阻害している要因の 1 つに、使い勝手の悪さがあ ります。本リリースでは、ユーザー・エクスペリエンスの簡素化と向上を実現す る多くの機能が導入されました。具体的には、JDK ライクなインタフェース、出 力のリダイレクト、プロパティ・インタフェース、データベース常駐型 JAR、2 層にわたって存続する Java セッション状態などです。 JDK ライクなインタフェース Oracle Database 11g の Oracle JVM は、JDK/JRE Java シェル・コマンドに類似した コマンドライン・インタフェースを提供します。このインタフェースは、JDK 仮 想マシン同様、コードをデータベースにロードせずに、ファイル・システムから Java コードを直接実行する機能を提供します。また、標準的な-classpath 構文 を使用して、Java コードをファイル・システムから検索し、実行できます。さら に、標準的な-D 構文を使用して、システム・プロパティを設定できます。 このコマンドライン・インタフェースは PL/SQL ファンクションであり、文字列 (VARCHAR2)の引数を受け入れ、コマンドライン入力として解析します。正しく 入力されると、インタフェースは、示された Java メソッドを Oracle JVM で実行し ます。上記の機能のために、PL/SQL パッケージ DBMS_JAVA は、runjava ファ ンクションを提供します。Java コマンドラインを唯一の引数として受け入れて、 Oracle JVM で実行します。 − コマンドラインのフォーマットは、JDK シェル・コマンドの場合と同じです。 [option switches] name_of_class_to_execute [arg1 arg2 ... argn] − スイッチは、-classpath、-D、-Xbootclasspath、および-jar です。 RUNJAVA コマンドライン・インタフェースは、 − JDK/JRE Java シェル・コマンドに類似しています − 標準的な-classpath 構文を使用して、ロードするクラスを探す場所を示し ます − 標準的な-D 構文により、システム・プロパティを設定できます − 次のファンクションによって、実装されます。 FUNCTION runjava(cmdline VARCHAR2)RETURN VARCHAR2; FUNCTION runjava_in_current_session(cmdline VARCHAR2) RETURN VARCHAR2; さらに、RUNJAVA コマンドラインは、OJVMJAVA に組み込まれています。 Oracle Database 11g に関する Java 開発者の展望 11 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 ojvmjava -u scott/tiger -runjava -d edidrp7p1:1521:ORCL -t $ java -cp .Workers 621 Director 150000 プロパティのインタフェース どの Java ランタイムでも、java.lang.System クラスには表が含まれ、一定の String キーを System.properties として知られている String の値に関連づ けます。この表の値は、ユーザー・コードの実行前に、Java セッションの初期化 で使用されます。Oracle Database 11g 以前のリリースの Oracle JVM には、システ ム・プロパティのデフォルトの初期設定を変更する手段がありませんでした。 システム・プロパティ設定の使い慣れた JDK behavior をエミュレートするため に、Oracle Database 11g では、システム・プロパティを設定、検索、削除、および 表示するファンクションで、DBMS_JAVA を拡張しました。RDBMS セッション内 には、データベース内で Java セッションが起動するたびに、システム・プロパティ に追加される値のセットを保持できます。 システム・プロパティを操作するファンクションは、鍵と値の両方が VARCHAR2 タイプである場合に、鍵/値ペアの方式で動作します。システム・プロパティの設 定、検索、削除、および表示をおこなう DBMS_JAVA ファンクションをスライド に表示します。 Oracle Database 11g では、RDBMS セッション内で維持されるシステム・プロパティ を設定できます。 DBMS_JAVA は、次の新しいファンクションを追加することによって拡張されます。 鍵/値ペアの設定 FUNCTION set_property(name VARCHAR2, value VARCHAR2) RETURN VARCHAR2; 鍵の値の取得 FUNCTION get_property(name VARCHAR2) RETURN VARCHAR2; 既存の鍵/値ペアの削除 FUNCTION remove_property(name VARCHAR2) RETURN VARCHAR2; FUNCTION show_property(name VARCHAR2) RETURN VARCHAR2 データベース常駐型 JAR データベース常駐型 JAR により、署名つきの JAR を使用できます。 JAR をデータベースにロードするために、loadjava は、2 つのオプションで拡張さ れています。 -jarsasdbobjects 現行の loadjava コマンドによって処理される JAR が、格納するクラス、ほかのオ ブジェクトとともにデータベースに保存され、オブジェクトと JAR の関連性につ いてのナレッジがデータベースに保持されることを示します。 -prependjarnames -jarsasdbobjects オプションとともに使用されます。このオプションによっ て、異なる JAR から取り込まれる同じ名前が、同一のスキーマに共存できます。 これは、JAR の名前のバージョンをクラス名の前に置いて、データベース・オブ ジェクトに一意の名前を生成することによって実現します。 Oracle Database 11g に関する Java 開発者の展望 12 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 2 層にわたって存続する Java セッション状態 Java セッションが終了すると、UGA/PGA メモリーや Java 静的変数など、さまざ まなリソースが開放されます。Oracle Database 11g 以前、RDBMS 内の Java セッショ ン を 終 了 す る 唯 一 の 方 法 は 、 System.exit メ ソ ッ ド ま た は 類 似 し た OracleRuntime メソッドを呼び出すことでした。 システム・プロパティを保存する場合にも、保存しない場合にも、RDBMS セッ ション内で Java を終了できるようになりました。 DBMS_JAVA は、次の新しいファンクションを追加することによって拡張されてい ます。 FUNCTION endsession RETURN VARCHAR2 FUNCTION endsession_and_related_state RETURN VARCHAR2 これらのファンクションを使用して、同一の RDBMS セッション内の Java の再初 期化を迅速化するためにプロパティ設定を維持する一方で、セッション中の Java を終了できます。また、この機能によって、System.exit を使用せずに、Java セッションを即座に終了できます。 出力のリダイレクト Java には、2 つの標準的な出力ストリームがあり、それぞれ System.out、 System.err と呼ばれています。Java プログラムは、OS シェルで実行され、 System.out と System.err は、シェルの stdout と stderr に対応します。 11g 以前のリリースの Oracle JVM には、このような対応関係はありませんでした。 したがって、Oracle JVM は“.trc”ファイルへの出力を作成するために使用され、こ のファイルは、DBMS_JAVA.set_output を使用して DBMS_OUTPUT へリダイレ クトされました。 Oracle JVM によって生成される Java 出力の宛先をよりよく制御するために、11g では SQL、自律型 Java セッション、またはファイルへの出力のリダイレクトをサ ポートします。11g では、これ以外に、トレース・ファイルへの出力の送信も無 効にできます。 出力をリダイレクトするために、PL/SQL DBMS_JAVA パッケージに次の新しい ファンクションが追加されています。 FUNCTION set_output_to_sql (id VARCHAR2,stmt VARCHAR2) デフォルトの System.out ストリームと System.err ストリームへの出力が発生する たびに、stmt として指定された SQL 文を実行します。それぞれが一意の id で識 別される複数のリダイレクション仕様を使用できます。 FUNCTION set_output_to_java (id VARCHAR2,class_name VARCHAR2,class_schema VARCHAR2,method VARCHAR2) デフォルトの System.out ストリームと System.err ストリームへの出力が発生する たびに、名前つき出力仕様を定義します。この仕様は、Java メソッド、スキーマ class_schema の class_name.method の実行に関する指示を与えます。 FUNCTION set_output_to_file (id VARCHAR2,file_path VARCHAR2) デフォルトの System.out ストリームと System.err ストリームに送られる任意の出 力を取得し、指定されたファイルに追加するための指示を構成する、名前つき出 力仕様を定義します。これは、set_output_to_java の特殊なケースを使用して、実 装されます。 Oracle Database 11g に関する Java 開発者の展望 13 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 FUNCTION remove_output_to_sql (id VARCHAR2) set_output_to_sql によって作成された仕様を削除します。同様に、set_output_to_java および set_output_to_file によって作成された仕様を削除するには、それぞれ remove_output_to_java および remove_output_to_file を呼び出します。 FUNCTION disable_output_to_sql (id VARCHAR2) set_output_to_sql に よ っ て 作 成 さ れ た 仕 様 を 無 効 に し ま す 。 同 様 に 、 set_output_to_java および set_output_to_file によって作成された仕様を無効にする には、それぞれ disable_output_to_java および disable_output_to_file を呼び出します。 FUNCTION enable_output_to_sql (id VARCHAR2) set_output_to_sql に よ っ て 作 成 さ れ た 仕 様 を 再 度 有 効 に し ま す 。 同 様 に 、 set_output_to_java および set_output_to_file によって作成された仕様を有効にする には、それぞれ enable_output_to_java および enable_output_to_file を呼び出します。 管理性 管理性は、Oracle データベースの周辺(JDBC、Java EE コンポーネントなど)ま たは Oracle データベースの内部(データベース内の Java など)で実行される Java アプリケーションの本番環境において重要な要件です。本リリースでは、次の管 理性機能を提供します。JDBC ロギング、プログラム的な起動と停止、Oracle JVM の JMX、および Oracle JVM ユーティリティの拡張のための MBean。 プログラム的な起動と停止 API により、適切なアクセス権/権限をもつ JDBC プログラムは、データベースを プログラム的に起動および停止できます。 起動 prop1.setProperty("user","sys"); prop1.setProperty("password","manager"); prop1.setProperty("internal_logon","sysdba"); … stmt.executeUpdate("ALTER DATABASE MOUNT"); stmt.executeUpdate("ALTER DATABASE OPEN"); 停止 stmt.executeUpdate("ALTER DATABASE CLOSE NORMAL"); stmt.executeUpdate("ALTER DATABASE DISMOUNT"); stmt.close(); conn.shutdown(OracleConnection.DBSHUTDOWN_FINAL); Oracle JVM の JMX Java Management Extensions(JMX)API(javax.management パッケージ)によ り、アプリケーション、システム・オブジェクト、デバイス、サービス指向ネッ トワークおよび Java 仮想マシンの管理と監視が可能になります。Java クラス (MBeans)は、インストール時に、リソースを監視および管理するために、動的 に作成し、ロードできます。これらの MBeans は、MBeans サーバーに登録されま す。JMX エージェントは、MBean サーバーと MBeans を処理する一連のサービス によって構成されます。MBeans は、MBean サーバーに登録されます。 Oracle Database 11g に関する Java 開発者の展望 14 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 JMX API には、リモート・アクセスが含まれ、外部の管理プログラムは、実行中 のアプリケーションと対話できます。 Oracle JVM 実装では、新規ロール JMXSERVER が導入され、セッションで JMX エージェントの起動と維持に必要な権限を提供します。さらに、新規プロシージャ 'dbms_java.start_jmx_agent'が、セッションの継続中に特定のセッションでエージェ ントを起動します。 ユーザー・セッションで JMX を起動するには、SYS または SYSTEM から JMXSERVER ロールを取得する必要があります。 SQL> grant jmxserver to scott; ユ ー ザ ー は 、 JMXSERVER ロ ー ル が 許 可 さ れ る と 、 プ ロ シ ー ジ ャ 'dbms_java.start_jmx_agent (<port> <ssl> <authentication>'により、セッションで JMX を起動できます。 SQL>call dbms_java.start_jmx_agent('9999', null, null); JMX サーバーは、現行セッションで、1 つ以上のデーモン・スレッドとして実行 されます。JMX サーバーでは、セッションで実行中の Java コードを監視できます。 JMX のサポートによって、Oracle JVM は、ブラック・ボックスからホワイト・ボッ クスへと変化しました。JConsole のような標準 JMX 対応のコンソールを使用して、 Java クラスを監視できます。 詳細は、『Oracle Database 11g Java 開発者ガイド』を参照してください。 JDBC の JMX:MBean のロギング JDBC ロギングは、プログラム的に、または Java システム・プロパティを介して、 構成できます。新規 JDBC MBean では、標準の java.util.logging フレーム ワークと javax.management フレームワークを使用して、JDBC ロギングをプ ログラム的に有効または無効にできます。 // get the MBean server javax.management.MBeanServer mbs = java.lang.management.ManagementFactory.getPlatformMBeanS erver(); // 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 Oracle Database 11g に関する Java 開発者の展望 15 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 mbs.setAttribute(name, new javax.management.Attribute("LoggingEnabled", false)); Oracle JVM ユーティリティの拡張機能 Oracle Database 11g では、データベースで Java クラスをロード、削除、および実 行するためのコマンドライン・ユーティリティを大幅に拡張しています。また、 Oracle Database 11g は、新規ユーティリティ(ojvmtc)を提供します。このユーティ リティにより、Java クラスおよび Java アーカイブ(JAR)は、ランタイムの前に すべての参照を解決できます。 OJVMTC:スタンドアロンの参照リゾルバ OJVMTC は、新しいスタンドアロンのクラス・クロージャ・ツール ojvmtc であ り、ファイル・システムの常駐クラスおよび配置可能な JAR の一定のリストが、 可能な限り、loadjava の起動前にクローズされていることを確認します。 このツールは、Oracle Database 内の Java アプリケーションの配置を簡素化します。 特定のクラスと Jar ファイルをクローズするには、-classpath オプションを使 用して、それらをコロンで区切ったリストで指定します。次の例では、app2.jar の外部参照を解決するために、接続文字列によって指定されたサーバーに見られ る jar1 と jar2 をクローズします。 ojvmtc -server thin@scott/tiger:localhost:1521:orcl -classpath jar1:jar2 -list app2.jar パラメータ-list は、参照が欠落している場合、stdout に印刷するように指定しま す。 また、オプション-jar を使用して、ojvmtc がクローズするすべてのクラスと JAR の Jar ファイルを作成できます。次の例では、rt.jar、classdir/lib1.jar および classdir/lib2.jar が、app.jar の参照を解決するために使用されて います。 ojvmtc -bootclasspath $JAVA_HOME/jre/lib/rt.jar -classpath classdir/lib1.jar:classdir/lib2.jar -jar set.jar app.jar -bootclasspath に指定されるクラスは、クロージャにも使用されますが、 -classpath に指定されるクラスとは異なり、クロージャ・セットに含まれてい ません。上記の例では、確認したクラスは、rt.jar に見られるクラスを除いて、 すべてが set.jar に追加されます。 loadjava に対する URL サポート loadjava は、URL を使用して、遠隔ロケーションから JAR、クラス・ファイル、 またはリソースをロードできます。新規オプション-proxy が、この機能をサポー トするために追加されています。 -proxy host:port Example: loadjava -u scott/tiger -r -v -proxy proxy_server:1020 http://my.server.com/path/my.jar Oracle Database 11g に関する Java 開発者の展望 16 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 リモート・ソースにアクセスするには、スキーマに Java ソケット権限が許可され ている必要があります。 dropjava を使用したリストに基づく操作 dropjava の以前のバージョンでは、クラス、JAR、ソース、およびリソースが マシンに存在し、そこでクライアント・サイドまたはサーバー・サイドのユーティ リティが実行されている必要がありました。Oracle Database 11g では、dropjava ツールは、オプション-list および-listfile によって拡張されています。こ れによって、クライアント・マシンまたはサーバー・マシンに存在しているかど うかわからない上記のオブジェクトを、クラスのリストに基づいて、簡単に削除 できます。 例: 1. この例のコマンドは、オプション-list を使用して、コマンドラインに列挙 され、クライアント・マシンまたはサーバー・マシンに存在していないクラ ス classA.classB.classC および classA.classD.classC を削除します。 2. この例のコマンドは、オプション-listfile を使用し、my.list に表示された クラスのリストに基づいて、リソースまたはソース、およびシノニムを削除 し、冗長的に表示します。 ojvmjava の拡張機能 本リリースでは、ojvmjava に次の拡張機能を提供します。 エラーと例外の対応:デバッグ・モードでない場合、無効なコマンドを認識して、 エラーを発行し、例外に対して生成されるスタック・トレース情報の量を削減し ます。 ojvmjava を終了しない接続の変更:新規コマンド-connect が ojvmjava に導 入されました。これを使用すると、ojvmjava を終了せずに、接続の変更を適用 できます。 -connect コマンドは、現在の接続を削除し、次のコマンド・オプションに基づ いて、別の接続を開こうとします。 -user (-u):ユーザー -password (-p):パスワード -thin (-t):JDBC Thin・ドライバを接続に使用 -oci、-oci8 (-o):ネイティブ oci JDBC ドライバを接続に使用 -database (-d):データベース記述子 例: connect -o -u scott/tiger connect -o -u scott/tiger@inst1 connect -u scott/tiger@localhost:1521:db -t Oracle Database 11g に関する Java 開発者の展望 17 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 結論 どのような方法で、1 日につき 100 万(またはそれ以上)のデータベース・ラウ ンドトリップを削減できますか。なぜデータベースの Java は、普及する準備がで きているのですか。 このホワイト・ペーパーでは、これらの質問に答え、生産性、移植性、セキュリ ティ、パフォーマンス、使いやすさ、および管理性の面で、Java 開発者が Oracle Databse 11g から得る重要なメリットを紹介しました。 Oracle Database 11g に関する Java 開発者の展望 18 Oracle Corporation 発行「Java Developer’s Perspective on Oracle Database 11g」の翻訳版です。 Oracle Database 11g に関する Java 開発者の展望 2007 年 6 月 著者:Kuassi Mensah Oracle Corporation World Headquarters 500 Oracle Parkway Redwood Shores, CA 94065 U.S.A. 海外からのお問い合わせ窓口: 電話:+1.650.506.7000 ファクシミリ:+1.650.506.7200 www.oracle.com Copyright © 2005, Oracle.All rights reserved. 本文書は情報提供のみを目的として提供されており、ここに記載される内容 は予告なく変更されることがあります。本文書は一切間違いがないことを保 証するものではなく、さらに、口述による明示または法律による黙示を問わ ず、特定の目的に対する商品性もしくは適合性についての黙示的な保証を含 み、いかなる他の保証や条件も提供するものではありません。オラクル社は 本文書に関するいかなる法的責任も明確に否認し、本文書によって直接的ま たは間接的に確立される契約義務はないものとします。本文書はオラクル社 の書面による許可を前もって得ることなく、いかなる目的のためにも、電子 または印刷を含むいかなる形式や手段によっても再作成または送信すること はできません。Oracle、JD Edwards、および PeopleSoft は、米国 Oracle Corporation およびその子会社、関連会社の登録商標です。その他の名称はそれぞれの会 社の商標です。