Cosminexus 機能解説

[目次][用語][索引][前へ][次へ]

5.13.1 Enterprise Bean共通の注意事項

Cosminexus上で動作するアプリケーションのプログラムとして,Enterprise Beanを実装するときの共通の注意事項を示します。

<この項の構成>
(1) Enterprise Beanおよび関連するクラスの命名規則
(2) リソースのコネクションの取得と解放
(3) ローカルインタフェースとリモートインタフェースの使い分け
(4) ローカル呼び出し最適化機能の利用について
(5) ほかのJ2EEアプリケーション内にあるEnterprise Beanをコンポーネントインタフェースによって呼び出す方法
(6) ほかのJ2EEアプリケーション内にあるEnterprise Beanをビジネスインタフェースによって呼び出す方法
(7) クラスローダの取得に関する注意
(8) URLConnectionクラス使用時の注意
(9) ネイティブライブラリのロードに関する注意
(10) Entity Bean(CMP,BMP共通)のアクセス排他のタイムアウトについて
(11) Entity Bean(CMP,BMP共通)使用時のデッドロックの発生について
(12) javax.ejb.EJBContextインタフェースメソッドについての注意事項
(13) Entity Bean(CMP,BMP共通)属性ファイルの<prim-key-class>タグについて
(14) EJBの仕様に関する注意
(15) Unicodeの補助文字の送受信に関する注意

(1) Enterprise Beanおよび関連するクラスの命名規則

Enterprise Beanクラス,ホームインタフェース,コンポーネントインタフェース,ビジネスインタフェース,インターセプタクラス,およびそれらで使用するクラスを実装する場合は,次に示す命名規則に従ってください。

(2) リソースのコネクションの取得と解放

Enterprise BeanでJDBC,JMSなどのJ2EEリソースのコネクションを使用する場合,Connectionクラスのcloseメソッドでコネクションを解放してください。コネクションを解放しないと,予期しないうちにリソースを消費し尽くしてしまいます。このような状況を避けるため,次のような点を考慮して実装してください。

(3) ローカルインタフェースとリモートインタフェースの使い分け

EJB 2.0仕様で追加されたローカルインタフェースを利用すると,RMI-IIOP通信処理のオーバーヘッドを削減できますが,ローカルインタフェースだけを持つEnterprise Beanはリモート呼び出しができません。また,ローカルインタフェースを使用する場合,メソッドの引数,戻り値がpass by referenceで動作できる必要があります。次に示すローカルインタフェースの使用条件を参考に,ローカルインタフェースとリモートインタフェースを使い分けてください。

ローカルインタフェースの使用が推奨される場合
Enterprise Beanとクライアント(Enterprise BeanまたはJSP/サーブレット)が同じJ2EEアプリケーションに含まれている場合,ローカルインタフェースの使用が推奨されます。

ローカルインタフェースの使用が必須の場合
CMP2.xのCMRは,ローカルインタフェースの使用が前提のため,ローカルインタフェースを使用してください。

ローカルインタフェースが使用できない場合
次の場合は,ローカルインタフェースが使用できません。
  • Enterprise Beanとクライアント(Enterprise BeanまたはJSP/サーブレット)が別のJ2EEアプリケーションに含まれている場合。
  • Enterprise Beanとクライアント(Enterprise BeanまたはJSP/サーブレット)がほかのJ2EEサーバ(別のJavaVM)で実行される場合。
  • EJB 1.1ですでに実装されている場合。

(4) ローカル呼び出し最適化機能の利用について

リモートインタフェース使用時にローカル呼び出し最適化機能を利用すると,RMI-IIOP通信処理のオーバーヘッドを削減できます。ローカル呼び出しは,メソッド呼び出しとほぼ同等の呼び出し形式になりますが,メソッドの引数,戻り値はpass by valueで処理されます。

(5) ほかのJ2EEアプリケーション内にあるEnterprise Beanをコンポーネントインタフェースによって呼び出す方法

同一J2EEサーバ内にある場合と,ほかのJ2EEサーバ内にある場合に分けて,ほかのJ2EEアプリケーション内にあるEnterprise Beanをコンポーネントインタフェースで呼び出す方法を示します。

(a) 同一J2EEサーバ内のほかのアプリケーションで動作するEnterprise Beanの場合

次の手順で呼び出します。

  1. 呼び出し元のEJB-JARファイルまたはWARファイルに,呼び出し先Enterprise Beanのリモートホームインタフェース,リモートインタフェースおよび各インタフェースで使用するユーザ作成クラスを含めます。
  2. J2EEサーバ用ユーザ定義ファイルに次に示すプロパティを指定します。
    usrconf.propertiesのejbserver.deploy.stub.generation.scopeキーに「app」を指定します。
    usrconf.propertiesについては,マニュアル「Cosminexus リファレンス 定義編」を参照してください。
  3. J2EEサーバ用ユーザ定義ファイルに次に示すプロパティを指定します。
    usrconf.propertiesのejbserver.rmi.localinvocation.scopeキーに「all」または「none」を指定します。
    usrconf.propertiesについては,マニュアル「Cosminexus リファレンス 定義編」を参照してください。
  4. ネーミングの切り替え機能を使用してcorbanameで始まる,ほかのJ2EEアプリケーション内のEnterprise Beanのルックアップ名を指定します。
    指定方法については,マニュアル「Cosminexus アプリケーション設定操作ガイド」の,ほかのEnterprise Beanのリファレンス定義の内容を参照してください。指定例を次に示します。
    corbaname::NamingHost:900#HITACHI_EJB/SERVERS/MyServer/EJB/MyApplication/MyBean
(b) ほかのJ2EEサーバ上で動作するEnterprise Beanの場合

次の手順で呼び出します。

  1. 呼び出し元のEJB-JARファイルまたはWARファイルに,呼び出し先Enterprise Beanのリモートホームインタフェース,リモートインタフェースおよび各インタフェースで使用するユーザ作成クラスを含めます。
  2. J2EEサーバ用ユーザ定義ファイルに次に示すプロパティを指定します。
    usrconf.propertiesのejbserver.deploy.stub.generation.scopeキーに「app」を指定します。
  3. ネーミングの切り替え機能を使用してcorbanameで始まるほかのJ2EEアプリケーション内のEnterprise Beanのルックアップ名を指定します。
    指定方法については,マニュアル「Cosminexus アプリケーション設定操作ガイド」の,ほかのEnterprise Beanのリファレンス定義の内容を参照してください。指定例を次に示します。
    corbaname::NamingHost:900#HITACHI_EJB/SERVERS/MyServer/EJB/MyApplication/MyBean

(6) ほかのJ2EEアプリケーション内にあるEnterprise Beanをビジネスインタフェースによって呼び出す方法

同一J2EEサーバ内にある場合と,ほかのJ2EEサーバ内にある場合に分けて,ほかのJ2EEアプリケーション内にあるEnterprise Beanをビジネスインタフェースで呼び出す方法を示します。

(a) 同一J2EEサーバ内のほかのアプリケーションで動作するEnterprise Beanの場合

次の手順で呼び出します。

  1. 呼び出し元のEJB-JARファイルまたはWARファイルに,呼び出し先Enterprise Beanのビジネスインタフェースおよびインタフェースで使用するユーザ作成クラスを含めます。
  2. J2EEサーバ用ユーザ定義ファイルのejbserver.rmi.localinvocation.scopeキーに「all」または,「none」を指定します。
  3. 「none」の場合は,呼び出し先のEnterprise Beanに対して,cjgetstubsjarコマンドでスタブを取得し,呼び出し元のEARファイルに含めます。
    Enterprise BeanはEJB参照を使用しないでルックアップします。ルックアップ名を指定する形式を示します。
    「HITACHI_EJB/SERVERS/<サーバ名> /EJBBI/<J2EE APP名>/<Enterprise Bean名>」
    <サーバ名>:J2EEサーバのサーバ名称
    <J2EE APP名>:J2EEアプリケーションのルックアップ名称
    <Enterprise Bean名>:Enterprise Beanのルックアップ名称

注※
アプリケーション間のビジネスインタフェース呼び出しで,ダイナミッククラスローディング機能を使用すればスタブを含める必要はありませんが,ダイナミッククラスローディング機能は性能上推奨しません。
(b) ほかのJ2EEサーバ上で動作するEnterprise Beanの場合

次の手順で呼び出します。

  1. 呼び出し元のEJB-JARファイルまたはWARファイルに,呼び出し先Enterprise Beanのビジネスインタフェースおよびインタフェースで使用するユーザ作成クラスを含めます。
  2. 呼び出し先のEnterprise Beanに対してcjgetstubsjarコマンドでスタブを取得し,呼び出し元のEARファイルに含めます。
    Enterprise BeanはEJB参照を使用しないでルックアップします。ルックアップ名を指定する形式を示します。
    「HITACHI_EJB/SERVERS/<サーバ名> /EJBBI/<J2EE APP名>/<Enterprise Bean名>」
    <サーバ名>:J2EEサーバのサーバ名称
    <J2EE APP名>:J2EEアプリケーションのルックアップ名称
    <Enterprise Bean名>:Enterprise Beanのルックアップ名称

注※
アプリケーション間のビジネスインタフェース呼び出しで,ダイナミッククラスローディング機能を使用すればスタブを含める必要はありませんが,ダイナミッククラスローディング機能は性能上推奨しません。

(7) クラスローダの取得に関する注意

J2EEアプリケーション内のコードからCosminexus Component Containerのクラスローダを取得して,次に示すAPIを使用する場合に,java.net.JarURLConnectionクラスが使用されます。

上記メソッドの延長でjava.net.JarURLConnectionクラスのopenConnectionメソッドが呼び出され,該当するURLに指定されたJARファイルがオープンされます。JARファイルに対する操作が必要でjava.net.JarURLConnectionクラスのopenConnectionメソッドを使用する場合には,該当するJARファイルに対してcloseメソッドを必ず呼び出すようにしてください。明示的にcloseメソッドを呼ばないかぎり,オープンされたままになり削除できません。また,上記メソッドはJ2EEアプリケーション内で使用しないでください。

(8) URLConnectionクラス使用時の注意

java.net.URLConnectionクラスはsetUseCaches(boolean)メソッドを使用して,指定されたURLに対してコネクションを取得するときにキャッシュの情報を利用するかどうかを指定できます。URLConnectionクラスに対してsetUseCaches(false)メソッドを指定した場合に,コネクションごとに対象のオブジェクトが生成されます。J2EEアプリケーション内のコードから使用する場合には,J2EEサーバのJavaVMがメモリリークするおそれがあります。

(9) ネイティブライブラリのロードに関する注意

System.loadLibraryメソッドを使用して,Enterprise Beanからネイティブライブラリをロードしないでください。Enterprise Beanでネイティブライブラリをロードすると,JNI仕様の制約によって,java.lang.UnsatisfiedLinkErrorが発生することがあります。ネイティブライブラリのロードが必要な場合は,System.loadLibraryメソッドを呼び出すコンテナ拡張ライブラリを作成し,Enterprise Beanからコンテナ拡張ライブラリを参照するように実装してください。コンテナ拡張ライブラリの作成については,「10.1 コンテナ拡張ライブラリの利用」を参照してください。

(10) Entity Bean(CMP,BMP共通)のアクセス排他のタイムアウトについて

Entity Bean(CMP,BMP)を使用する場合,同一プライマリキーのEntity Beanに対するアクセスには排他が掛かります。同時に同一のプライマリキーのEntity Beanに対してアクセスし,処理時間が掛かる場合は,排他待ちが行われます。排他待ちの結果,排他を取得できなかった場合は,タイムアウト(デフォルト45秒)で例外IllegalStateExceptionが発生します。この場合,J2EEサーバ用ユーザ定義ファイル(/opt/Cosminexus/CC/server/usrconf/ejb/<サーバ名称>/usrconf.properties)のejbserver.server.mutex.invocation.timeoutキーにタイムアウト時間を指定してタイムアウトを発生させないようにすることができます。ejbserver.server.mutex.invocation.timeoutキーについては,マニュアル「Cosminexus リファレンス 定義編」を参照してください。

(11) Entity Bean(CMP,BMP共通)使用時のデッドロックの発生について

Application Serverでは,Entity Beanのトランザクション処理にデータベースのトランザクション機能を使用しています。データベースへのアクセスの順番,データの排他にかかわるテーブルの設定,データベースのシステムの設定,および呼び出すSQL文によっては,デッドロックが発生する場合があります。詳細は使用しているデータベースのマニュアルを参照してください。

(12) javax.ejb.EJBContextインタフェースメソッドについての注意事項

javax.ejb.EJBContextインタフェースのgetUserTransactionメソッド,getRollbackOnlyメソッド,setRollbackOnlyメソッドについては,Enterprise Beanのトランザクション管理モデルによっては発行できません。また,Enterprise Beanのメソッドのうち,EJB仕様で"Unspecified transaction"で動作するとされるものでは,発行できません。発行できない場合,EJBコンテナはjava.lang.IllegalStateExceptionを送出します。各メソッドの発行可否についてそれぞれの表に示します。

表5-27 トランザクション管理モデル別の発行可否

javax.ejb.EJBContextメソッド 発行可否
BMT CMT
getUserTransaction ×
getRollbackOnly ×
setRollbackOnly ×

(凡例)○:発行できる ×:発行できない


表5-28 EJBのメソッド別の発行可否

Bean種別 メソッド 発行可否
SessionBean コンストラクタ ×
setSessionContext ×
ejbCreate ×
ejbRemove ×
ejbPassivate ×
ejbActivate ×
ビジネスメソッド
afterBegin
beforeCompletion
afterCompletion ×
EntityBean コンストラクタ
setEntityContext ×
unsetEntityContext ×
ejbCreate
ejbPostCreate
ejbRemove
ejbHome
ejbPassivate ×
ejbActivate ×
ejbLoad
ejbStore
ビジネスメソッド
Message-driven Bean コンストラクタ ×
ejbCreate ×
onMessage
メッセージリスナのメソッド
ejbRemove ×

(凡例)○:発行できる ×:発行できない


(13) Entity Bean(CMP,BMP共通)属性ファイルの<prim-key-class>タグについて

Entity Bean属性ファイルの<prim-key-class>タグにインタフェースおよび抽象クラスを指定した場合,次のように動作します。

(14) EJBの仕様に関する注意

EJB仕様に従っていない記述をした場合,エラー(例外)が発生することがあります。以前のバージョンでエラーが発生しなくても,バージョンアップをしたときにエラーになることがあります。エラーが発生した場合は,エラーの内容を確認し,EJB仕様に従って変更してください。

(15) Unicodeの補助文字の送受信に関する注意

構成ソフトウェアにCosminexus TPBrokerを含むApplication Serverでは,RMI-IIOP通信によるEnterprise Beanのメソッド呼び出しで,Unicodeの補助文字を送受信できます。この場合,送信側と受信側のApplication Serverのバージョンによって,Unicodeの補助文字の送受信時の動作が異なります。Application Serverのバージョンの組み合わせと,Unicodeの補助文字送受信時の動作を次の表に示します。

表5-29 Application Serverのバージョンの組み合わせと,Unicodeの補助文字送受信時の動作

送信側のApplication Serverのバージョン 受信側のApplication Serverのバージョン
07-50以降 07-50より前
07-50以降 ×
07-50より前 × ×

(凡例)
○:Unicodeの補助文字を送受信できる
×:Unicodeの補助文字を送受信できない

Unicodeの補助文字送受信ができないバージョンの場合,RMI-IIOP通信によるUnicodeの補助文字送受信時に,java.rmi.RemoteExceptionの例外またはjava.rmi.MarshalExceptionの例外がスローされます。

なお,Unicodeの補助文字を送受信した場合の動作を,07-50より前と同じ動作に設定できます。07-50より前と同じ動作を設定したい場合は,usrconf.properties(J2EEサーバ用ユーザプロパティファイル,およびJavaアプリケーション用ユーザプロパティファイル)で,vbroker.orb.htc.surrogateCheckOffキーに「false」を設定してください。キーの詳細については,マニュアル「TPBroker ユーザーズガイド」を参照してください。