8. EJBコンテナ |
EJBコンテナの注意・制限事項について説明します。
8.1. 注意事項 |
RMI-IIOPのダイナミック・プロキシ使用時の注意事項
Ver6.3よりEJBの通信プロトコルであるRMI-IIOP通信モードに関して、ダイナミック・プロキシを使用するモードが追加されました、配備オプションでダイナミック・プロキシを使用するかどうかを指定することができますが、既定値ではダイナミック・プロキシで動作します。ダイナミック・プロキシを使用してEJB間の呼び出しを行う場合、いくつか制限事項があります。詳しくはObject Broker Javaの制限事項の RMI-IIOP のダイナミック・プロキシによる通信モード使用時の制限事項 を参照してください。
クライアント・アプリケーション
クライアント・アプリケーションのコンパイルおよび、実行時には、WebOTXサーバ製品または「WebOTX Client」をインストールする必要があります。
必要なクラスパスやJava起動時のシステムプロパティの設定に関しての詳細は、「アプリケーション開発ガイド」のEJBのクライアントアプリケーションの章を参照してください。
また、J2EE仕様に則ったクライアントアプリケーションJarを実行するためのコマンドが準備されています。デザインガイドのアプリケーションクライアントを参照してください。
タイマーBeanの機能について
EJB 2.1仕様で追加されたタイマーBeanの機能はデータベースを使用するため、デフォルトでは使用できません。運用マニュアルを参照してデータソースとデータベースのテーブル追加を行なってください。
サーバとクライアントのJava VMのバージョン
EJBのサーバとクライアントで使用しているJava VMのバージョンはマイナーバージョンレベルまで一致させる必要があります。
rmicタイムアウトによる配備の失敗について
リモートインタフェースを持つEJBを配備する際にダイナミック・プロキシを使用しないように設定されている場合、RMI-IIOPのスタブ、スケルトンの生成のためrmicコンパイルが行なわれます(デフォルトは行いません)。このrmicコンパイル処理にはタイムアウト時間が設定されていますが、rmicの処理はかなりのCPUパワーを必要とするため、使用しているCPUによってはタイムアウトが発生して配備が失敗する可能性があります。このとき、webotx_deploy.logに以下のようなメッセージが出力されます。
OTX03010054: rmic compilation failed... [Job_Executor0] com.nec.webotx.ejb.codegen.ProcessExecutorException: Process timed out.
デフォルトのrmicのタイムアウト時間はEJBのホーム、リモートインタフェース1つにつき600秒に設定されています。この値を変更するにはドメインのJavaオプションに以下を追加してください。
-Dcom.nec.webotx.deployment.Rmic.TimeoutMS=<1インタフェースのrmicタイムアウト時間(msec)>
CMP Entity BeanでOracleデータベースを使用する場合の注意事項
CMPの永続化フィールドとしてデータベースにバイト配列としてマッピングされるデータ(byte[], java.io.Serializable実装したクラス)のサイズが特定の値を超えるとデータベース書き込み時にSQLExceptionが発生する場合があります。これは Oracle10g Release2より前のJDBCドライバを使用している場合に発生します。Oracle10g Release2 のJDBCドライバを使用すれば発生しません。
CMPの永続化フィールドとしてデータベースにバイト配列としてマッピングされるデータ(byte[], java.io.Serializableを実装したクラス)を複数持つ場合、そのサイズが特定の値を超えると永続化フィールドに格納される値が不正になる場合があります。これは Oracle10g Release2 またはOracle10.1.0.4より前のJDBCドライバを使用している場合に発生します。 新しいJDBCドライバを使用すれば発生しません。
CMP Entity BeanでSybaseデータベースを使用する場合の注意事項
入力が255文字を超え、主キーカラムがVARCHARカラムにマッピングされているファインダーメソッドを実行した場合、SybaseはVARCHAR型をTEXT型に変更しようと試み、以下のエラーを生成します。
com.sybase.jdbc2.jdbc.SybSQLException: Implicit conversion from datatype 'TEXT' to 'VARCHAR' is not allowed. Use the CONVERT function to run this query.
このエラーを避けるには、ファインダーメソッドの入力が255文字以下となるようにしてください。
CMPフィールドがJavaのDate型かTime型(java.util.Date, java.sql.Date,java.sql.Time, java.sql.Timestamp)である場合、フィールドの値が正確にデータベースの値と一致するように注意してください。
例えば、以下のコードは主キーフィールドとしてjava.sql.Date型を使います。
java.sql.Date myDate = new java.sql.Date(System.currentTimeMillis())beanHome.create(myDate, ...);
データベースによっては、このコードはデータベースにフィールドの値の年、月、および日付の部分だけを保存します。以下のようにクライアントがこのBeanを主キーによって見つけようとすると
myBean = beanHome.findByPrimaryKey(myDate);
そのBeanはデータベース中から見つけることはできません。値がデータベースに保存された値と一致しないからです。
保存している間に、データベースがタイムスタンプ値を切り捨てるか、またはカスタムクエリにwhere節において日付か時間値の比較がある場合、同様の問題が起こる可能性があります。
自動マッピングとオラクルデータベースを使用すると、タイプjava.util.Date、java.sql.Date、java.sql.Time、およびjava.sql.TimestampのすべてのフィールドがオラクルのDATEデータ型にマッピングされます
8.2. 制限事項 |
Standard/Enterprise Editionにおいて、WebOTX DeveloperでWebサービスエンドポイント複数含むEJBをひとつのアーカイブで作成し、配備した場合、そのうちのひとつしか呼び出すことができません。別アーカイブに分けてアプリケーションを作成するようにしてください。
EJB 仕様では、Enterprise BeanのコンストラクタでJNDIアクセスを許可していませんが、WebOTX EJBコンテナではJNDIアクセスが可能になっています。
コンテナ管理によるトランザクション設定を持つEnterprise Beanが、名前サーバに登録されたUserTransactionオブジェクト参照をlookup()メソッド使用して取得することが可能になっていますが、 EJB仕様では、このタイプのEnterprise Beanに対してアクセスを許可していません。
ステートレスSession Beanがremove()メソッドを呼び出した後に、Beanのメソッドを呼び出しても例外が発生しません。
Enterprise Bean内部でjavax.naming.InitialContextオブジェクトを取得したとき、そのオブジェクトのlookup()メソッド以外も呼び出すことが可能になっていますが、EJB 仕様では、lookup()メソッドのみが呼び出し可能となっています。
ステートフルSession Beanで、ejbActivate()とejbPassivate()メソッド内から、EJBContextクラスのisCallerInRole()とgetCallerPrincipal()メソッドを呼び出すことはできません。
EJB QLのwhere 節に OR 演算子と単一値の CMPナビゲーションが含まれる場合、 クエリの検索結果が実際の検索結果よりも不足する場合があります。この場合は、OR演算子で結合されている演算を別々のEJB QLとして定義し、別々に検索を行って結果をマージするようにEJBの処理を修正してください。