2013年3月1日金曜日

Struts1.3+EJB3.0 の lookup 方式およびパフォーマンス

レガシーStruts(Struts1.3)の Action クラスで EJB3.0 を呼び出す場合、インジェクションができないので lookup で呼び出す必要があります。WebLogic11g の場合ですが、以下のように記述できます。


■インタフェース

@Local
@Remote
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 だけはリモートから探しに行っているようで、そこが遅いのではないかと考えました。そこで以下のようにコードを修正してみました。

■リモート
@Local
public interface MyBean

■EJB
@Stateless
public class MyBeanEJB implements MyBean {

■lookup
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となり、大きく改善しました。こんなところに罠がしかけられていたんですね。。。





0 コメント:

コメントを投稿