• ベストアンサー

データベースに格納時

はじめまして、JAVAの勉強を始めて1ヶ月ほどの ひよっこですがご教授お願いします。 MYSQLとJAVAで、簡単な社員管理のサーブレットを 作成しています。それで、データベースの情報を 操作時に、複数のクライアントから同時に リクエストされても、エラーが起こらないように したいのですが、データを削除、追加、削除を行う メソッドを、 public static synchronized メソッド名(引数) としておけば大丈夫でしょうか? よろしくお願いします。

  • Java
  • 回答数4
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

>public static synchronized メソッド名(引数) >としておけば大丈夫でしょうか? はい、それでOKです。 synchronized が指定されたメソッドを実行できるのは1つのスレッドだけであることが保証されています。 従って、そのメソッドを実行中のスレッドがある場合、他のスレッドは、メソッドの実行が完了する迄、待たされます。ですから、synchronizedを指定したメソッドは、出来るだけ短時間で処理が完了するように、作成しなければなりません。

osorairo
質問者

お礼

ありがとうございます。一応できてはいたんですが、 実際に複数クライアントからテストができる環境 ではないため、少し不安でした。

その他の回答 (3)

noname#86752
noname#86752
回答No.4

synchronizedははまり易いので念のため細かく説明します。 public static synchronized a() という書き方は、メソッドaがおかれているクラス毎にsynchronizedされます。 つまりメソッドaを使うスレッドが複数あったときは、想像通りsynchronizedされます。 しかし別のクラスに同じように public static synchronized b() があった場合、上のaとbはsynchronizedされません。 あくまでも「そのメソッドがあるクラス毎にsynchronizedされる」のです。 したがってsynchronizedを使ってデータに不整合がおきないようなものを作るためには、データベースの更新を行うメソッドを全て同じクラスに入れる必要があります。 この「データ更新クラス」を用意する設計はシステムが大きくなると、クラスの肥大化を招くので使いどころに注意してください。 最後に蛇足になるかもしれませんが、staticがないメソッドにsynchronizedをつけた場合はクラス毎ではなくオブジェクト毎になります。

osorairo
質問者

お礼

レスありがとうございます。 そうですかデータ更新を行うメソッドは同じ クラスに書かないとだめなんですね。 非常に参考になりました。

noname#86752
noname#86752
回答No.2

#1さんがおっしゃりたいのはJava側でどうこうするのではなくMySQLのBEGIN/COMMIT/ROLLBACKを使えと言うことだと思います。 私もそうすると思います。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

自分だったらDBの更新時にトランザクションを利用しますが…それではだめなのでしょうか?

osorairo
質問者

補足

ちょっと今調べてみたのですが、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 を使えってことなんですよ。 すいませんけどご教授お願いします。

関連するQ&A

  • Javaのメモリの管理

    なんか基本的なことなんですけど、ちゃんと把握していないなーと思って質問します。 staticメソッドを使用してしまうと、メモリ上に残ってしまうからあまり使うななどとよく言うと思います。これに対して、staticでないメソッドは使用されている間はstaticと同じように管理され、使用後に開放対象となるということなのか。というか、非staticメソッドは、2箇所から同時にアクセスされたらメソッド2つ分のメモリを使用するのか。その前に、staticメソッドであっても、同時に2箇所からアクセスされたら2つ分のメモリを消費するはずではないのか。 サーブレットでは、アクセスのあったサーブレットクラスがインスタンス化され、そのインスタンスが何度も使い回される、との記述を見たが、複数のアクセスがあったときに同時に処理ができるが、これは実質メモリ上に複数のメソッドが存在することにならないのか… ロードの際にはクラス単位で読み込まれるのか、メソッド単位なのか。staticメソッドと非staticメソッドが混在しているクラスでは、読込み、開放はメソッド単位で行っているのか。 などの疑問を持っています。以上、まとまりのない疑問ですが、なんとなく私がわからない部分はわかっていただいたのではないかと思います。この辺の話について、よろしくお願いします。

    • ベストアンサー
    • Java
  • doGetの引数に「入るモノ」について

    サーブレットにおけるクラスのdoGetメソッドについて 質問です(Tomcat3.2.1 + JDK1.3)。 public void doGet(HttpServletRequest request, HttpServletResponse response) 理屈で考えると、このdoGetメソッドの2つの仮引数 (request, response)には、 「インターフェースHttpServletRequestをimplements したクラス」のインスタンス ‥‥と、 「インターフェースHttpServletRequestをimplements したクラス」のインスタンス の2つのインスタンスが入れられるハズですよね。 そこで疑問なのが、 1. それら2つのクラスの名前はなんというのでしょう? (というのはインターフェースHttpServletRequestや インターフェースHttpServletResponseを 実装したクラスのメソッドの処理内容の定義を 見たいのです‥) 2. 誰がそのクラスをインスタンス化しているのでしょう? (サーブレットコンテナのTomcat? JRE? JVM?‥ いったい誰が?‥‥用語の区別も曖昧なのですが) 補足すると、 Javaアプリケーションのmainメソッドでは、 public static void main(String[] args) として、コマンドラインの引数がそのまま仮引数argsに 入る。じゃあ、サーブレットの場合はどうなのか? といった感じです。 2.のほうはトンチンカンな質問かもしれませんが、 1.の質問は切実です。 ご存知の方、教えてください。

    • ベストアンサー
    • Java
  • staticのメリット、デメリット

    こんばんは。 staticについて、だんだんわからなくなってきました・・・。 例えばあるクラスの変数で、 static int i = 10; とあった場合、参照クラスからiの値を見ると、必ず10ですよね? static修飾子がついているメソッドの場合、挙動はどうなるのでしょう? staticなメソッドはインスタンス化しなくても呼び出せる。 つまり、メモリ上に1箇所しか存在しないので、同時にアクセスされた場合(synchronizedしていない場合)はどうなるのかがわかりません・・・。 メソッドには引数が存在し、returnがStringやintなどの場合です。 returnは保証(参照側にとって望む値と言う意味で)されるのでしょうか? インスタンス化をしない事によって、パフォーマンスが向上するのでしょうけれど、いまいちメリットがわかりません・・・。 public、privateにかかわらず、メソッドをstatic修飾するメリットを教えてください。 同時にデメリットもお願いします。 以上、下手くそな文章ですみません・・・。 (^^ゞ

    • ベストアンサー
    • Java
  • サーブレットでデータベース操作。

    サーブレットを使ってMySQL内のテーブルにレコードを追加、変更、削除できるようなプログラムを作っています。流れとしましては『HTML画面→サーブレット起動→レコード追加、変更、削除』といった具合です。追加、変更ができてなぜか削除だけできません。SQL文を書き換えるだけのはずなのですが・・。どなたか教えて下さい。windows2000Professional, j2sdk1.4.0_01, Tomcat3.3.1,MySQL3.23.47 略 . . Connection con = null; Statement stmt = null; try { con = DriverManager.getConnection( "jdbc:mysql://localhost/db_ichat", "root", "pen3"); stmt = con.createStatement(); String seqno = request.getParameter("seqno"); String name = request.getParameter("name"); String namejp = new String(name.getBytes("8859_1"), "JISAutoDetect"); String psw = request.getParameter("psw"); String pswjp = new String(psw.getBytes("8859_1"), "JISAutoDetect"); String email = request.getParameter("email"); StringBuffer buf = new StringBuffer(); buf.append("delete from t_id "); buf.append("where seqno = "); buf.append(seqno); stmt.executeUpdate(buf.toString()); try { stmt.close(); } catch (Exception e) {} try { con.close(); } catch (Exception e) {} . . 略。

    • ベストアンサー
    • Java
  • 「データベースを設計する」←?

    興味からデータベースを勉強してみたいと思っている者です。 今までデータベースは、MySQLでjavaから呼んで単純に一つテーブルを作って挿入、削除、などを実装したくらいの知識しかありません。 しかし、その一方でデータベースのみを扱った本などを読むと、正規系、ERモデル、スキーマなど読んでもよくわからないことが多く出てきます。 その二つがつながらないのですが、それは経験的に簡単なデータしか扱ったことがないからでしょうか?また、データベースのことが分かるようになるような、具体的な勉強ルートみたいなものについて、アドバイスがいただけると嬉しいです。 よろしくお願いします。

  • データベース処理のプログラミングについて

    データベースを処理するためのプログラムを作成していますが、そのコーティングで悩んでいます。 説明が長くなってしまいますが、お付き合いいただける方、ご教示頂ける方がいらっしゃることを、切に願います。 まずは現在の状況説明ですが、下記のような感じでプログラムを作っています。 データベースに、Table1があります。 ・Table1・・・fld1~fld10までの10個のフィールドがあり、fld1が主キー また、このテーブルを処理するためのクラスがあります。 ・データベース処理系のクラス・・・clsTable1 clsTable1では、各フィールドを、メンバ、プロパティとして作ってあります。 ・メンバ:_fld1、 プロパティ:fld1 ・・・ メンバ:_fld10、 プロパティ:fld10 また、Table1に対してSQLを発行するためのメソッドがあります。 ・SelectRecord・・・主キーで検索して1件だけ返すメソッド(検索のためfld1が必要) ・InsertRecord・・・Insert用メソッド(fld1~fld10の全てが必要) ・UpdateRecord・・・主キーで検索し、該当するレコードのfld2を更新するメソッド(検索値のfld1と更新値のfld2が必要) また、あるフィールドの範囲検索などをするメソッドとして、 ・SelectRecords・・・fld3を範囲検索して複数レコードを返すメソッド(fld3をBETWEEN演算子で検索するためfld3minとfld3maxが必要) を作成した場合は、fld3minとfld3max用のメンバとプロパティを追加しています。 これらのメソッドは全て引数なしになっていて、フォームなどから使う場合は必要なプロパティに値を代入してから各メソッドを呼んでいます。 そのため、メソッドを呼び出す際には、どのプロパティを設定する必要があるのかが分からないです。 (作っている時は記憶で、メンテの時はコメントやソースを見て判断しています。) これを改善するために、設定が必要なフィールド全てを各メソッドの引数にしてしまえば良いのかとも思ったのですが、そうするとInsertRecoedの引数は10個になります。 仮にフィールド数が100列のテーブルだったりした場合は引数が100個になってしまうので、それもダメだろうと思っています。 Insert以外でも、詳細な検索などが必要な場合や、全フィールドのUpdateの場合にも、引数が多くなりすぎです。 どんな感じにすればよろしいのでしょうか? また、みなさんは、どんな感じにされているのでしょうか? 開発環境: SQL Server 2000 Standard Visual Basic 2010 Express

  • PHPのシンクロ処理

    JAVAにはsynchronized メソッドがあり、メソッドの排他制御がありますが、 PHPにはあるのでしょうか? もしないとすれば、変数などが同時アクセスの場合、 予期せぬ値に変わってしまうため、どのように処理をすればよろしいでしょうか。 ご教授お願い申し上げます。

    • 締切済み
    • PHP
  • データベースでないデータベースを利用したい

    Linux上でMySQL、PostgreSQL、SQLiteなどのデータベースが一切使えない サーバ上でデータベース(もどき)を利用したいです。 そのサーバはXMLファイル操作も出来ません。 現段階だとテキストベースにfopen()などでごりごり追加・修正・削除を行うクラスを作って 利用するくらいしか思いつきません。 どなたか良い方法があればご教示下さい。 因みにPEARも利用しない事を前提です。

    • 締切済み
    • PHP
  • データベースへ接続

    JAVAを使ってMySQLへ接続して、テーブルにデータを挿入するプログラムを作ったのですが、エラーが出てしまいます。 環境変数は CLASSPATHは .;%JAVA_HOME%\lib\tools.jar;C:\mysql-connector-java-3.0.16-ga\mysql-connector-java-3.0.16-ga\mysql-connector-java-3.0.16-ga-bin.jar;. PATHは %JAVA_HOME%\bin;C:\Program Files\MySQL\MySQL Server 4.1\bin JAVA_HOMEは C:\Program Files\Java\jdk1.5.0_11 です。 プログラム内容は // InsertSample.java import java.sql.*; class InsertSample { public static void main(String args[]){ Connection con = null; Statement stmt = null; // 引数のチェック if(args.length != 6){ System.out.println("usage : java InsertSample<id> <name> <yomi> <yubin> <address> <tel>"); return; } try { // JDBCドライバの登録 String driver = "org.gjt.mm.mysql.Driver"; // データベースの指定 String url = "jdbc:mysql://localhost/sampledb?useUnicode=true&characterEncoding=Shift_JIS"; String user = "root"; // 環境に応じて設定 String password = ""; // 環境に応じて設定 Class.forName (driver); // データベースとの接続 con = DriverManager.getConnection(url, user, password); stmt = con.createStatement(); // SQL文の作成 String sql = "INSERT INTO members VALUES('" + args[0] + "','" + args[1] + "','" + args[2] + "','" + args[3] + "','" + args[4] + "','" + args[5] + "'" + ")"; // 更新の実行 int num = stmt.executeUpdate(sql); System.out.println(args[0] + "の" + num + "行を追加"); } catch (SQLException ex) { System.err.println("SQL failed."); ex.printStackTrace (); } catch (Exception ex) { ex.printStackTrace (); } finally { try{ // データベースのクローズ stmt.close(); con.close(); } catch (Exception ex) { ex.printStackTrace (); } } } } で、エラーの内容は java.sql.SQLEception : Invalid authorization specification massage from server : "Access denied for user 'root'@'localhost' (using password : NO)" とでてしまいます。どのように改善したらよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • MySQL データベースをデタッチ

    MySQLで複数のデータベースを稼働していますが、サーバーの物理メモリ量が不足しているため現在使用していないデータベースをオフラインにしたいと思います。 削除はしたくないので SQL Server でいうところの「デタッチ」をしたいのですが、方法をご存じの方がいらっしゃいましたら教えて頂けないでしょうか? 宜しくお願い致します。