Javaサーブレットにおいて、複数の画面にまたがるデータベーストランザクションを扱う方法を教えてください。

 なお、その方法について、具体的に説明しているサイトや書籍なども教えていただけるとありがたいです。

回答の条件
  • 1人2回まで
  • 登録:2006/10/05 18:52:14
  • 終了:2006/10/06 19:01:06

ベストアンサー

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402006/10/05 19:09:39

ポイント300pt

単にトランザクションを継続させたいだけなら、ユーザーごとに Connection を生成し、HttpSession に格納しておくだけで実現は可能だと思います。


ただし、Web アプリケーションにおいては以下の記事の

http://www.atmarkit.co.jp/fjava/keyword/jkey/jkey05.html

■Webアプリケーションのトランザクション の項にあるようにトランザクションは限定的に使用しないとパフォーマンス上致命的な欠陥を持つことになります。

画面遷移をまたがったデータベーストランザクションは使用しない方が賢明です。

id:lains_you

 どうもありがとうございます。

 HttpSessionを利用し、とりあえずロックをかけることはできました。

 依頼主に問題点を告げてみたのですが、排他制御を行いたいとの意向から、やはりトランザクションありになってしまいました。

2006/10/06 11:42:26

その他の回答(1件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402006/10/05 19:09:39ここでベストアンサー

ポイント300pt

単にトランザクションを継続させたいだけなら、ユーザーごとに Connection を生成し、HttpSession に格納しておくだけで実現は可能だと思います。


ただし、Web アプリケーションにおいては以下の記事の

http://www.atmarkit.co.jp/fjava/keyword/jkey/jkey05.html

■Webアプリケーションのトランザクション の項にあるようにトランザクションは限定的に使用しないとパフォーマンス上致命的な欠陥を持つことになります。

画面遷移をまたがったデータベーストランザクションは使用しない方が賢明です。

id:lains_you

 どうもありがとうございます。

 HttpSessionを利用し、とりあえずロックをかけることはできました。

 依頼主に問題点を告げてみたのですが、排他制御を行いたいとの意向から、やはりトランザクションありになってしまいました。

2006/10/06 11:42:26
id:F57PB No.2

F57PB回答回数86ベストアンサー獲得回数02006/10/05 21:27:29

ポイント100pt

最善の方法は、画面にまたがるトランザクションがなくなるように

画面仕様・構成・画面遷移を見直すことだと思います。


llusallさんが指摘されているように、クライアントの操作が介在する

ので、トランザクションの維持はかなり難しいと思います。


また、一般的にトランザクションの生存時間は短ければ短いほど良く、

アプリケーションサーバのJTS(Java Transaction Service)実装や、

DBMSによって、トランザクションの最大生存時間も制限されると思います。


さらに、JTA(Java Transaction API)によるトランザクション管理もできません。

(JTAは最近のJavaアプリケーションでは一般的なトランザクション管理APIです。

JTAはスレッドとトランザクションを関連付けます。画面をまたがるということは、

スレッドが変わることを意味しますので、JTAでトランザクションを維持できません)


さらにさらに、EJBはJTAでトランザクションを管理するため、EJBは使えません。



どうしても、となるとHttpSessionにConnectionを格納する等して自前で

仕組みを作るしかないと思いますが、そうなるとConnectionが長時間アクティブ

なままになるため、コネクションプールが枯渇する恐れも出てきますね。


やはり、画面仕様の見直しをオススメします。

id:lains_you

 どうもありがとうございます。

 画面自体は一つなのですが、同期Ajaxでロックありの検索と更新を行っています。

 セッション削除時にコネクションをクローズし、ページロード/アンロード、画面クリア時にサーブレット側でコネクションクローズとセッションの削除を行うようにしました。

 他に何か抜けている点をご存知の方がいらっしゃいましたら、ご教示ください。

2006/10/06 11:45:33
  • id:llusall
    ユーザの操作によっては、ものスゴ~ぉく長時間のトランザクションになるかと思いますが、大丈夫なんでしょうか?

    ブラウザ閉じちゃったらどうするんでしょうかね。
    セッションの切断までトランザクションがかかったままなんでしょうか??
    (そぉいうのを上手くクリアする方法を知りたいのでしょうかね)
  • id:lains_you
     HttpSessionやEJBを使用するのかな?というほんの触りぐらいの知識しかないため、複数画面にわたるトランザクションを実現するためにはどんな方があるのか、それに付随する問題点など幅広く知りたいです。

     llusallさんの述べられた問題点も解決する方法があれば、是非教えていただきたいです。

     以上、よろしくお願いします。
  • id:b-wind
    >排他制御を行いたいとの意向

    排他制御自体はDBのトランザクションを使用しなくてもよいのでは?
    回答しておいてなんですが、自分の出した案は Webアプリケーションにおいて「やってはいけないこと」に分類される内容です。
    実装しだいでいくらでも回避可能だと思いますが、その方法はやりたい処理によって変わってくるので、もう少し状況を説明していただけないと回答を得るのは難しいと思います。
  • id:lains_you
     b-windさん、どうもありがとうございます。

     実現したいのは、表示中のデータにロックをかけ、他のユーザーから更新できないようにしたいだけなんです。
     更新データもSQL一文で書ける程度です。検索SQL一回、更新SQL一回の流れの繰り返しです。

     トランザクション以外の方法で私が思いついたのは、テーブルに使用中を示す項目を一つ追加し、それが使用中だったら更新させない、途中でセッションが切れたら使用中を非使用に戻す、というような方法ぐらいです。(これから提案してきます)

     他に良い方法があればご教示ください。
  • id:b-wind
    セッションが切れたら、ではなくDBにタイムアウトのカラムを持たせた方がいいですね。アプリケーションが不正終了するとロックがかかったままの扱いになりますから。

    使用中を表す項目には更新するユーザーのIDを入れておき、更新直前にもIDとタイムアウトの値を確認してOKの場合のみ更新、NGならエラー画面でどうでしょうか?
  • id:lains_you
     タイムアウト値を持つ方法は良いですね。なるほどと頷かせていただきました。b-windさんのご意見を元に仕様を詰めてみたいと思います。
     どうもありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません