5.13.1 Enterprise Bean共通の注意事項
(1) Enterprise Beanおよび関連するクラスの命名規則
Enterprise Beanクラス,ホームインタフェース,コンポーネントインタフェース,ビジネスインタフェース,インターセプタクラス,およびそれらで使用するクラスを実装する場合は,次に示す命名規則に従ってください。
- Enterprise Beanおよび関連するクラスのクラス名と同じ名前で始まるパッケージに,それらのクラスを配置しないでください。
- 「Wrappers.」で始まるパッケージ名は使用できません。
- Enterprise Beanクラス,ホームインタフェース,コンポーネントインタフェース,およびビジネスインタフェースの名称では,英数字および記号を使用します。アンダースコア(_)で始まるメソッド名,およびメンバ変数名は使用できません。
- Entity BeanのCMPではアンダースコア(_)で始まるCMPフィールド名,およびCMRフィールド名は指定できません。
- 大文字,小文字の違いだけのパッケージ名称,およびクラス名称は利用できません。RMI-IIOPでは大文字,小文字が区別されないため,Enterprise Beanに正常にアクセスできなくなるおそれがあります。
- JARファイル中にあるホームインタフェースなど,java.rmi.Remoteを実装したクラスがあると,スタブは作業ディレクトリ内に生成されます。作業ディレクトリのパス長がプラットフォームの上限に達しないようにjava.rmi.Remoteを実装したクラスのパッケージ名やクラス名を指定してください。作業ディレクトリのパス長の見積もりについては,マニュアル「Cosminexus システム構築ガイド」を参照してください。
- EJB-JARファイルが別の場合でも,同じアプリケーション内では,クラスが重複しないようにしてください。
- Enterprise Beanのリモートインタフェース,リモートコンポーネントインタフェースのクラス名は,VisiBrokerの予約名を使用しないでください。なお,VisiBrokerの予約名には,「Helper」,「Holder」,「Package」,「Operations」,「POA」,および「POATie」があります。VisiBrokerの予約名については,マニュアル「Borland(R) Enterprise Server VisiBroker(R) プログラマーズリファレンス」を参照してください。
- デフォルトパッケージにEnterprise Beanクラスを作成する場合,次に示す文字列で終わるクラスをデフォルトパッケージに作成しないでください。
- _LocalHomeImpl
- _LocalComponentImpl
- _RemoteHomeImpl
- _RemoteComponentImpl
- _LocalBIProxyImpl
- _LocalBIClientSideProxyImpl
- _RemoteBIProxyInterface
- _RemoteBIProxyImpl
- _RemoteBIClientSideProxyImpl
- _CallbackWrapperImpl
- _InvocationContextImpl
(2) リソースのコネクションの取得と解放
Enterprise BeanでJDBC,JMSなどのJ2EEリソースのコネクションを使用する場合,Connectionクラスのcloseメソッドでコネクションを解放してください。コネクションを解放しないと,予期しないうちにリソースを消費し尽くしてしまいます。このような状況を避けるため,次のような点を考慮して実装してください。
- コネクションをEnterprise Beanクラスのメンバ変数に保持しないようにします。
コネクションをメンバ変数に保持していると,Beanの実行に関係なくコネクションが使用状態のままになり,パフォーマンスが低下します。そのため,SQL実行時にコネクションの取得と解放をするようにしてください。
- コネクションプールを設定します。
コネクションプールを設定すると,物理的コネクションを再利用するためコネクション取得のオーバーヘッドを削減できます。また,JTAのトランザクション配下で実行する場合はコネクションプールの設定をする必要があります。
(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の場合
次の手順で呼び出します。
- 呼び出し元のEJB-JARファイルまたはWARファイルに,呼び出し先Enterprise Beanのリモートホームインタフェース,リモートインタフェースおよび各インタフェースで使用するユーザ作成クラスを含めます。
- J2EEサーバ用ユーザ定義ファイルに次に示すプロパティを指定します。
usrconf.propertiesのejbserver.deploy.stub.generation.scopeキーに「app」を指定します。
usrconf.propertiesについては,マニュアル「Cosminexus リファレンス 定義編」を参照してください。
- J2EEサーバ用ユーザ定義ファイルに次に示すプロパティを指定します。
usrconf.propertiesのejbserver.rmi.localinvocation.scopeキーに「all」または「none」を指定します。
usrconf.propertiesについては,マニュアル「Cosminexus リファレンス 定義編」を参照してください。
- ネーミングの切り替え機能を使用してcorbanameで始まる,ほかのJ2EEアプリケーション内のEnterprise Beanのルックアップ名を指定します。
指定方法については,マニュアル「Cosminexus アプリケーション設定操作ガイド」の,ほかのEnterprise Beanのリファレンス定義の内容を参照してください。指定例を次に示します。
corbaname::NamingHost:900#HITACHI_EJB/SERVERS/MyServer/EJB/MyApplication/MyBean
(b) ほかのJ2EEサーバ上で動作するEnterprise Beanの場合
次の手順で呼び出します。
- 呼び出し元のEJB-JARファイルまたはWARファイルに,呼び出し先Enterprise Beanのリモートホームインタフェース,リモートインタフェースおよび各インタフェースで使用するユーザ作成クラスを含めます。
- J2EEサーバ用ユーザ定義ファイルに次に示すプロパティを指定します。
usrconf.propertiesのejbserver.deploy.stub.generation.scopeキーに「app」を指定します。
- ネーミングの切り替え機能を使用して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の場合
次の手順で呼び出します。
- 呼び出し元のEJB-JARファイルまたはWARファイルに,呼び出し先Enterprise Beanのビジネスインタフェースおよびインタフェースで使用するユーザ作成クラスを含めます。
- J2EEサーバ用ユーザ定義ファイルのejbserver.rmi.localinvocation.scopeキーに「all」または,「none」を指定します。
- 「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の場合
次の手順で呼び出します。
- 呼び出し元のEJB-JARファイルまたはWARファイルに,呼び出し先Enterprise Beanのビジネスインタフェースおよびインタフェースで使用するユーザ作成クラスを含めます。
- 呼び出し先の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クラスが使用されます。
- getResource(String).openConnection().getInputStream();
- getResource(String).openStream()
上記メソッドの延長で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>タグにインタフェースおよび抽象クラスを指定した場合,次のように動作します。
- Entity Bean(CMP)の場合
デプロイ時にエラーメッセージKDJE42039-Eが出力され,デプロイ処理はエラーで終了します。
- Entity Bean(BMP)の場合
クラスを指定したときと同様,デプロイおよび実行できます。
(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 ユーザーズガイド」を参照してください。