- - PR -
インスタンスを跨いだ情報の共有
«前のページへ
1|2|3
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-11-10 13:51
ごめんなさい、適当こいてました。
SingleTreadModel自身はサーブレットのAPIでした。 EJBサーバー側でメソッド呼び出しに排他制御をかけてしまえば、意図した 動作にはなりますよね。 彷徨える〜さんのおっしゃるとおり、クラスタ化したサーバの外側のサーバ として独立して立ち上げてはどうかというつもりでしたが、確かにインギさん のおっしゃるとおりそこで全てのEJB呼び出しが直列化されてしまうと、呼び 出し回数が多ければボトルネックになりますよね。 そのあたりは、並行呼び出しを行ってもかまわないブロックごとに分割する とかで、どうでしょうか? | ||||
|
投稿日時: 2004-11-10 15:54
そうですよね。SingleThreadModelはServletの話ですよね。 で、今実験君してみました。 StatelessSessionBeanでキャッシュの数(max-beans-in-free-pool)を1に設定したEJBを作ってそのBeanクラスに既存のsingleton-objectのロジックを盛り込んでデプロイしてみました。 とりあえず今は同じインスタンスにデプロイしています。一応EJBをlookupするときのcontextにリモート指定t3://ip-address:portを指定しているのでリモート扱いになっていると思います。 500件程度検索する業務で改善の前後で時間を測定してみましたが、さほど差は出ていません。リモート指定でも実際にネットワークを介して離れている場合、マシンが違う場合はもっと差がでるかもしれませんが、まだためしていません。 処理の結果はほぼ期待通りの結果ですが、人不思議に思うのがStatelessSessionBeanがどのレベルで排他制御しているのか?ということです。 2つのブラウザから同じ業務同じ検索条件でよーいドン!で検索実行するとどちらか片方のブラウザ側が全件排他を取得できて、他方は0件なのです。StatelessSessionBeanmの排他取得のメソッドの呼び出しの単位でコンテナが排他制御しているなら、お互いのブラウザで歯抜けになる部分があると思うのですが・・・ | ||||
|
投稿日時: 2004-11-10 16:30
>EJBサーバー側でメソッド呼び出しに排他制御をかけてしまえば、意図し
メソッド呼び出しがスレッドセーフに行われることはEJBの仕様で保証されています。 「よーいドン!」でも実際にメソッド呼び出しが行われるタイミングに差があるだけではないでしょうか? allow-concurrent-callsを false に設定した状態で手動でテストしたばあい RemoteException が発生するかどうかで切り分けられます。 均一に同時呼び出しを行ってみたいのであればHttpUnitなどをつかって機械的にテストしてみましょう。 | ||||
|
投稿日時: 2004-11-10 17:19
#本題とはそれますが。
Weblogicですよね? 確かWeblogicは、EJBコンテナとEJBのクライアントが同一のJVM上であった場合、 リモートI/Oのオーバーヘッドを除去する目的で、自動的にEJB LocalInterface 相当の呼び出しをしてしまうという"独自仕様"があるらしいことを、誰かから聞 いた覚えがあるような… もしそれが働いているなら、その程度の負荷の処理では、スレッドがそのような スケジューリングをされることは十分ありえそうですよね。 [ メッセージ編集済み 編集者: シュン 編集日時 2004-11-10 17:23 ] | ||||
|
投稿日時: 2004-11-10 17:53
EJB の参照呼び出しによる最適化はWLS8.1ではデフォルトではoffになっています。
http://edocs.beasys.co.jp/e-docs/wls/docs81/ejb/reference.html#147013 これは同一の ear 内の呼び出しかつ weblogic-ejb-jar.xml の call-by-reference 要素が True に設定されている場合だけ有効です。 #プロダクションシステムでは基本的に有効にすべきだと思いますが。 今回の場合クラスタの一部にしかデプロイしていないということですので同じ ear には含めていないでしょうから参照呼び出しはされていないでしょう。 また、参照呼び出しが有効であるかどうかとメソッド呼び出しの順序は関係ないと思います。 |
«前のページへ
1|2|3