0

現在、エンタープライズ アプリケーションのデプロイに JBoss 5.1.0 GA ビルドを使用しています。EJBLocalHome remove() API の動作に関する奇妙な問題に直面しています。「Emp」というエンティティ Bean があります。「emp1」などのエンティティ Bean を削除する必要があります。したがって、「Emp」EntityBean#ejbRemove() API を呼び出してデータベースから Bean を削除する EJBLocalObject remove() を呼び出します。remove() -> ejbRemove()

Jboss AS の場合、remove() API を呼び出すと、最初に ejbStore() API が呼び出され、次に同じトランザクションで ejbRemove() API が呼び出されることがわかりました。remove() API の間、エンティティ Bean は変更されません。したがって、ejbStore() を呼び出すべきではありません。しかし、そうです。したがって、シーケンスは次のとおりです。- remove() -> ejbStore() -> ejbRemove()

アプリケーションを Websphere AS にデプロイしました。remove() を呼び出したときの呼び出しシーケンスは、 remove() -> ejbRemove() でした。この場合、ejbStore() は呼び出されませんでした。

JBoss AS の場合になぜそのような動作が発生するのか誰にもわかりますか? 何も更新されておらず、動作は Webspehere に似ているはずなので、 ejbStore() を呼び出すべきではないと思います。

-アジット

4

1 に答える 1

0

JBoss固有の問題のようです。JBoss の内部実装を確認したところ、構成要素「sync-on-commit-only」が false に設定されている場合に ejbStore が呼び出されることがわかりました。このプロパティは standardjboss.xml ファイルにあり、デフォルト値は false です。これは、Jboss 仕様がこの要素について述べていることです:- 「これにより、エンティティ Bean の状態がコミット時にのみデータベースと同期されるパフォーマンスの最適化が構成されます。通常、トランザクション内のすべての Bean の状態を同期する必要があります。たとえば、finder メソッドが呼び出されたとき、または remove メソッドが呼び出されたときです。」

したがって、'sync-on-commit-only' が false に設定されている場合、ejbStore() が呼び出され、Bean が削除される前にエンティティがデータストアと同期されます。

このプロパティが true/false に設定されているかどうかに関係なく、エンティティ Bean がデータソースから削除されることに気付きました。したがって、最終的に Bean がデータソースから削除され、インスタンス プールに戻されるため、remove() 中になぜ ejbStore() 呼び出しが必要なのか疑問に思っています。

-アジット

于 2013-04-25T05:44:27.767 に答える