Cosminexus 機能解説
Cosminexus上で動作するアプリケーションのプログラムとして,Enterprise Beanを実装するときの共通の注意事項を示します。
Enterprise Beanクラス,ホームインタフェース,コンポーネントインタフェース,ビジネスインタフェース,インターセプタクラス,およびそれらで使用するクラスを実装する場合は,次に示す命名規則に従ってください。
Enterprise BeanでJDBC,JMSなどのJ2EEリソースのコネクションを使用する場合,Connectionクラスのcloseメソッドでコネクションを解放してください。コネクションを解放しないと,予期しないうちにリソースを消費し尽くしてしまいます。このような状況を避けるため,次のような点を考慮して実装してください。
EJB 2.0仕様で追加されたローカルインタフェースを利用すると,RMI-IIOP通信処理のオーバーヘッドを削減できますが,ローカルインタフェースだけを持つEnterprise Beanはリモート呼び出しができません。また,ローカルインタフェースを使用する場合,メソッドの引数,戻り値がpass by referenceで動作できる必要があります。次に示すローカルインタフェースの使用条件を参考に,ローカルインタフェースとリモートインタフェースを使い分けてください。
リモートインタフェース使用時にローカル呼び出し最適化機能を利用すると,RMI-IIOP通信処理のオーバーヘッドを削減できます。ローカル呼び出しは,メソッド呼び出しとほぼ同等の呼び出し形式になりますが,メソッドの引数,戻り値はpass by valueで処理されます。
同一J2EEサーバ内にある場合と,ほかのJ2EEサーバ内にある場合に分けて,ほかのJ2EEアプリケーション内にあるEnterprise Beanをコンポーネントインタフェースで呼び出す方法を示します。
次の手順で呼び出します。
corbaname::NamingHost:900#HITACHI_EJB/SERVERS/MyServer/EJB/MyApplication/MyBean
次の手順で呼び出します。
corbaname::NamingHost:900#HITACHI_EJB/SERVERS/MyServer/EJB/MyApplication/MyBean
同一J2EEサーバ内にある場合と,ほかのJ2EEサーバ内にある場合に分けて,ほかのJ2EEアプリケーション内にあるEnterprise Beanをビジネスインタフェースで呼び出す方法を示します。
次の手順で呼び出します。
次の手順で呼び出します。
J2EEアプリケーション内のコードからCosminexus Component Containerのクラスローダを取得して,次に示すAPIを使用する場合に,java.net.JarURLConnectionクラスが使用されます。
上記メソッドの延長でjava.net.JarURLConnectionクラスのopenConnectionメソッドが呼び出され,該当するURLに指定されたJARファイルがオープンされます。JARファイルに対する操作が必要でjava.net.JarURLConnectionクラスのopenConnectionメソッドを使用する場合には,該当するJARファイルに対してcloseメソッドを必ず呼び出すようにしてください。明示的にcloseメソッドを呼ばないかぎり,オープンされたままになり削除できません。また,上記メソッドはJ2EEアプリケーション内で使用しないでください。
java.net.URLConnectionクラスはsetUseCaches(boolean)メソッドを使用して,指定されたURLに対してコネクションを取得するときにキャッシュの情報を利用するかどうかを指定できます。URLConnectionクラスに対してsetUseCaches(false)メソッドを指定した場合に,コネクションごとに対象のオブジェクトが生成されます。J2EEアプリケーション内のコードから使用する場合には,J2EEサーバのJavaVMがメモリリークするおそれがあります。
System.loadLibraryメソッドを使用して,Enterprise Beanからネイティブライブラリをロードしないでください。Enterprise Beanでネイティブライブラリをロードすると,JNI仕様の制約によって,java.lang.UnsatisfiedLinkErrorが発生することがあります。ネイティブライブラリのロードが必要な場合は,System.loadLibraryメソッドを呼び出すコンテナ拡張ライブラリを作成し,Enterprise Beanからコンテナ拡張ライブラリを参照するように実装してください。コンテナ拡張ライブラリの作成については,「10.1 コンテナ拡張ライブラリの利用」を参照してください。
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 リファレンス 定義編」を参照してください。
Application Serverでは,Entity Beanのトランザクション処理にデータベースのトランザクション機能を使用しています。データベースへのアクセスの順番,データの排他にかかわるテーブルの設定,データベースのシステムの設定,および呼び出すSQL文によっては,デッドロックが発生する場合があります。詳細は使用しているデータベースのマニュアルを参照してください。
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 | × |
(凡例)○:発行できる ×:発行できない
Entity Bean属性ファイルの<prim-key-class>タグにインタフェースおよび抽象クラスを指定した場合,次のように動作します。
EJB仕様に従っていない記述をした場合,エラー(例外)が発生することがあります。以前のバージョンでエラーが発生しなくても,バージョンアップをしたときにエラーになることがあります。エラーが発生した場合は,エラーの内容を確認し,EJB仕様に従って変更してください。
構成ソフトウェアに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の補助文字送受信ができないバージョンの場合,RMI-IIOP通信によるUnicodeの補助文字送受信時に,java.rmi.RemoteExceptionの例外またはjava.rmi.MarshalExceptionの例外がスローされます。
なお,Unicodeの補助文字を送受信した場合の動作を,07-50より前と同じ動作に設定できます。07-50より前と同じ動作を設定したい場合は,usrconf.properties(J2EEサーバ用ユーザプロパティファイル,およびJavaアプリケーション用ユーザプロパティファイル)で,vbroker.orb.htc.surrogateCheckOffキーに「false」を設定してください。キーの詳細については,マニュアル「TPBroker ユーザーズガイド」を参照してください。
All Rights Reserved. Copyright (C) 2006, 2007, Hitachi, Ltd.