- ベストアンサー
データベースに格納時
はじめまして、JAVAの勉強を始めて1ヶ月ほどの ひよっこですがご教授お願いします。 MYSQLとJAVAで、簡単な社員管理のサーブレットを 作成しています。それで、データベースの情報を 操作時に、複数のクライアントから同時に リクエストされても、エラーが起こらないように したいのですが、データを削除、追加、削除を行う メソッドを、 public static synchronized メソッド名(引数) としておけば大丈夫でしょうか? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>public static synchronized メソッド名(引数) >としておけば大丈夫でしょうか? はい、それでOKです。 synchronized が指定されたメソッドを実行できるのは1つのスレッドだけであることが保証されています。 従って、そのメソッドを実行中のスレッドがある場合、他のスレッドは、メソッドの実行が完了する迄、待たされます。ですから、synchronizedを指定したメソッドは、出来るだけ短時間で処理が完了するように、作成しなければなりません。
その他の回答 (3)
synchronizedははまり易いので念のため細かく説明します。 public static synchronized a() という書き方は、メソッドaがおかれているクラス毎にsynchronizedされます。 つまりメソッドaを使うスレッドが複数あったときは、想像通りsynchronizedされます。 しかし別のクラスに同じように public static synchronized b() があった場合、上のaとbはsynchronizedされません。 あくまでも「そのメソッドがあるクラス毎にsynchronizedされる」のです。 したがってsynchronizedを使ってデータに不整合がおきないようなものを作るためには、データベースの更新を行うメソッドを全て同じクラスに入れる必要があります。 この「データ更新クラス」を用意する設計はシステムが大きくなると、クラスの肥大化を招くので使いどころに注意してください。 最後に蛇足になるかもしれませんが、staticがないメソッドにsynchronizedをつけた場合はクラス毎ではなくオブジェクト毎になります。
お礼
レスありがとうございます。 そうですかデータ更新を行うメソッドは同じ クラスに書かないとだめなんですね。 非常に参考になりました。
#1さんがおっしゃりたいのはJava側でどうこうするのではなくMySQLのBEGIN/COMMIT/ROLLBACKを使えと言うことだと思います。 私もそうすると思います。
- hitomura
- ベストアンサー率48% (325/664)
自分だったらDBの更新時にトランザクションを利用しますが…それではだめなのでしょうか?
補足
ちょっと今調べてみたのですが、javax.Transactionというパッケージを使うということでしょうか? UserTransaction ut = sc.getUserTransaction(); InitialContext ctx = new InitialContext(); Connection conn = ds.getConnection(); Statement statement = conn.createStatement(); ut.begin(); statement.executeUpdate("INSERT INTO account (id, value) VALUES (100, 100)"); statement.close(); conn.close(); ut.commit(); こんな感じにやるとデータ保全性を保障してくれるってことですかね・・・ ただ今回は課題の条件で static synchronized を使えってことなんですよ。 すいませんけどご教授お願いします。
お礼
ありがとうございます。一応できてはいたんですが、 実際に複数クライアントからテストができる環境 ではないため、少し不安でした。