- PR -

インスタンスを跨いだ情報の共有

投稿者投稿内容
彷徨える開発者
常連さん
会議室デビュー日: 2004/07/15
投稿数: 31
投稿日時: 2004-11-09 16:07
現在、WebLogic6.1sp6+Postgresql 7.3.6上で申込書の受付システムが稼働しています。
申込書にはユニークな受付番号が起票時に付与されます。
同じ受付番号の申込書を同時に複数のユーザで編集できないように排他制御が当初から要求仕様で求められていました。

通常であれば、申込書毎にタイムスタンプを持って、DB更新時にタイムスタンプを比較することで、編集を割り込まれたかどうかを判断し、エラーとするところですがこれでは要求仕様を満たしません。

ユーザの要求は申込書を開く前に他の誰かが編集していたらその旨表示し、編集させない。項目が多く、結構複雑な申込書なのでさんざん入力したあげく「他の人に割り込まれたから更新できません」で入力した内容が捨てられてしまうのではイ・ケ・ナ・イ、と。

こういった要求仕様なので現在はsingleton-objectなhashtableに申込書の受付番号をキーに付随する情報を持って誰かが編集中であるかどうかを判断しています。

とりあえず、今のところはこの方法で何ら問題ないのですが、将来的に業務量からWebLogicが1インスタンスで性能不足になった場合インスタンスを増やしたり、クラスタ化ができません。singleton-objectなhashtableは同一インスタンスでしか共有できないので。

WebLogicを複数インスタンス化やクラスタ化を見据えた場合、こういった排他制御はどのように実現すればよいのでしょうか?DBに排他制御情報をもつことも考えたのですが、トランザクションのタイミングを考えると結構複雑の様な気がしますし・・・
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-09 16:13
StatefulSessionBean か EntityBean を使ってはいかがでしょうか。
彷徨える開発者
常連さん
会議室デビュー日: 2004/07/15
投稿数: 31
投稿日時: 2004-11-09 16:23
引用:

インギさんの書き込み (2004-11-09 16:13) より:
StatefulSessionBean か EntityBean を使ってはいかがでしょうか。



DBに排他制御情報を持つならEntityBeanを使うことになると思います。

StatefulSessionBeanはセッション毎に独立なので、AさんのStatefulSessionBeanの中身はBさんの中身と異なるので使えないと思いますが。それともAさんとBさんの中身を同期する方法があるのでしょうか?
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-11-09 16:23
設計はキチンと考える必要がありますが、データベースに制御情報を持つのが確実でしょう。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-09 16:34
>StatefulSessionBeanはセッション毎に独立なので、AさんのStatefulSessionBeanの中身はBさんの中身と異
>なるので使えないと思いますが。それともAさんとBさんの中身を同期する方法があるのでしょうか?
ごもっともです。StatefulSessionBean のハンドルを共有する方法があればそもそも問題にならないですよね。

EntityBeanが無難かな?
編集状況を永続化する必要はないと思うので BMP でも大丈夫そうですね。
彷徨える開発者
常連さん
会議室デビュー日: 2004/07/15
投稿数: 31
投稿日時: 2004-11-09 17:20
引用:

ukさんの書き込み (2004-11-09 16:23) より:
設計はキチンと考える必要がありますが、データベースに制御情報を持つのが確実でしょう。


やはりDBに持つというのが正論でしょうか?

そうなると面倒なのがトランザクション。申込書の承認機能もあるので一度に複数の申込書をDBから持ってくる時があります。EntityBeanを申込書のデータ用と排他制御用を分けると片方を呼び出してもう片方を呼び出す間に他の人に割り込まれる可能性が有るのではないかと思います。
ひとつのEntityBeanで実現しようとすると申込書のデータは照会なのに排他制御情報は更新しなければならないので、どう実現したらよいのか。
彷徨える開発者
常連さん
会議室デビュー日: 2004/07/15
投稿数: 31
投稿日時: 2004-11-09 17:21
引用:

EntityBeanが無難かな?
編集状況を永続化する必要はないと思うので BMP でも大丈夫そうですね。



永続化しないで異なるインスタンス間、あるいはクラスタ間で共有する方法があるんですか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-09 17:32
>永続化しないで異なるインスタンス間、あるいはクラスタ間で共有する方法が
えぇっと、複数のサーバにデプロイするならDBでシェアする必要がありますが、EJBですから単一サーバにだけデプロイしてしまえば良いですね。
#ってSessionBeanでも同じか。

スキルアップ/キャリアアップ(JOB@IT)