- - PR -
tomcatでのコンテキスト情報のレプリケーション
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-10-23 17:24
こんにちは。
上記の件で質問があります。 tomcatにて、セッションレプリケーションの機能がありますが、この機能とは別に、 コンテキスト情報をレプリケーションさせる方法を探しています。 3台tomcatがいて、そのうちの1台がServletContext#setAttribute()を実行すると、 残りの2台にセットした内容がレプリケーションされるといったことをやりたいのです。 ご存知の方、ご意見の程宜しくお願い致します。 以上です。 WIN XP TOMCAT 5.5.1 JDK 1.5.0_06 | ||||
|
投稿日時: 2006-10-23 17:46
無理だと思います。 クラスタ構成では、ノード間で共有するデータはDBを利用するのが一般的です。 頻繁にアクセスするからパフォーマンスに影響する、というのであれば、 適切にキャッシュする作りにすればいいわけです。 実行時に遅延初期化以外の理由でServletContext#setAttribute()を行うのは あまりいい設計ではないと思いますし、ServletContextに入るオブジェクトの 多くは各種フレームワークの実行用の共有オブジェクトだったりするわけで、 シリアル化できない可能性が非常に高いのではないでしょうか。 ちなみにHttpSessionの場合は、web.xmlに<distributable>がない場合を除いて、 setAttribute()するオブジェクトは必ずjava.io.Serializableを実装している 必要があることが仕様で明記されていたような気がします。 | ||||
|
投稿日時: 2006-10-23 20:55
ServletContextAttributeListenerインタフェースの
attributeAdded、attributeReplaced、attributeRemoved の中で、共有データをCRUDする実装してあげれば良いと 思います。処理タイミングは良いとして、あしゅさんも 文中で言ってますが、問題はどこに共有データを保存する のかだと思います。メモリ上でのレプリケーションを使わない とすると、DBまたはNFSなどの外部ストレージ上になるとは 思うのですが、処理効率は悪くなります。まっその分クラスタ サーバの台数を増やせばカバーできるとは思うので、許容でき るかもしれませんが。PHPなどでは、セッション情報を管理する サーバプログラムを別に起動して、そこを経由してセッション データの共有化を行うという環境もあるようですよ。 できるだけ実行環境で用意されている機能を使った方が、何かと 良いかとは思います。 | ||||
|
投稿日時: 2006-10-24 11:21
あしゅさん、小僧さん。
ご返答ありがとうございました。 確かに外部ストレージに保存すべきですよね。。。 DBの設定を変更するようにしてレスポンスの向上に努めようと思います。 どうもありがとうございました。 |
1