レガシーStruts(Struts1.3)の Action クラスで EJB3.0 を呼び出す場合、インジェクションができないので lookup で呼び出す必要があります。WebLogic11g の場合ですが、以下のように記述できます。
■インタフェース
public interface MyBean
■EJB
@Stateless(mappedName = "MyBean")
public class MyBeanEJB implements MyBean {
■lookup
Context ctx = new InitialContext();
MyBean ejb = (MyBean)ctx.lookup("MyBean#" + MyBean.class.getName());
この記述で、一見正常に動作しているように見えましたが、1つ問題が発生しました。負荷テストを実施した際、この EJB の利用部分でものすごくパフォーマンスが悪いことが判明したのです。EJB 自体はStruts と同じサーバ(ローカル)で稼働しているため、普通にローカル呼び出しになっているのですが、その前段階の lookup が異常に遅いことが判明しました(負荷がかかった状態で、10sec くらいかかってしまう)。
おそらく、lookup だけはリモートから探しに行っているようで、そこが遅いのではないかと考えました。そこで以下のようにコードを修正してみました。
■リモート
■EJB
■web.xml
<ejb-local-ref>
<ejb-ref-name>ejb/MyBean</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>mypackage.ejb.MyBean</local>
</ejb-local-ref>
実験してみたところ、同じ lookup の速度が数msとなり、大きく改善しました。こんなところに罠がしかけられていたんですね。。。
■インタフェース
@Local
@Remotepublic interface MyBean
■EJB
@Stateless(mappedName = "MyBean")
public class MyBeanEJB implements MyBean {
■lookup
Context ctx = new InitialContext();
MyBean ejb = (MyBean)ctx.lookup("MyBean#" + MyBean.class.getName());
この記述で、一見正常に動作しているように見えましたが、1つ問題が発生しました。負荷テストを実施した際、この EJB の利用部分でものすごくパフォーマンスが悪いことが判明したのです。EJB 自体はStruts と同じサーバ(ローカル)で稼働しているため、普通にローカル呼び出しになっているのですが、その前段階の lookup が異常に遅いことが判明しました(負荷がかかった状態で、10sec くらいかかってしまう)。
おそらく、lookup だけはリモートから探しに行っているようで、そこが遅いのではないかと考えました。そこで以下のようにコードを修正してみました。
■リモート
@Local
public interface MyBean■EJB
@Stateless
public class MyBeanEJB implements MyBean {
public class MyBeanEJB implements MyBean {
■lookup
Context ctx = new InitialContext();
MyBean ejb = ctx.lookup ("java:comp/env/ejb/MyBean"/MyBean");
Context ctx = new InitialContext();
MyBean ejb = ctx.lookup ("java:comp/env/ejb/MyBean"/MyBean");
■web.xml
<ejb-local-ref>
<ejb-ref-name>ejb/MyBean</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>mypackage.ejb.MyBean</local>
</ejb-local-ref>
実験してみたところ、同じ lookup の速度が数msとなり、大きく改善しました。こんなところに罠がしかけられていたんですね。。。