
以下のようにプログラムを作成した場合に
疑問点がありますので、ご教授願います。
public class Sample extends HttpServlet{
private static final int int_OK = 0; // 戻り値(OK)
private Stringname; // 名前
private Stringdb_name; // DB名前
protected void doPost(HttpServletRequest req,HttpServletResponse res)
throws ServletException, IOException{
// リクエストパラメータ取得
name = req.getParameter("name");// 名前
// DB検索
db_name = rs.getString("name");
// 結果を返却
}
}
【疑問点】
(1) 排他制御やスレッドを行っていません。
・変数はすべてprivate宣言していますが、
同時アクセスが行われた際の変数はどのようになるのでしょうか?
(2) SingleThreadModelを実装した際はどのような動きになりますでしょうか?
不足点などあるかと思いますが、よろしくお願いします。

No.3ベストアンサー
- 回答日時:
No.2です。
だとしたら、引数で渡した方がいいと思います。
もし数が多いようであれば、データに対応するクラスを1つ作って渡せばいいと思います。
なぜなら。
せっかくサーブレットというマルチスレッドのものを使っているのに、わざわざシングルスレッドにして、アクセス数に比例してユーザーの応答時間を長くする必要はないと思うので。
また、せっかくDBという排他制御の備わったものを使っているのに(お使いのDBが何かはわかりませんが、まず間違いないでしょう)、わざわざパフォーマンス落とす必要もないと思います(ファイルの読み書きでデータを拾っているのならともかく)。
この回答への補足
ご回答ありがとうございます。
また、お礼が遅くなりまして申し訳ありません。
ここでまたひとつ質問ですが、
クラスを作成した場合はそのクラスはpublicになると思いますが、
同時にdoPostの要求がきた場合は値が書き換わることはないのでしょうか?
お礼の欄にすみせん。
上記の内容が間違っていましたので訂正します。
public class Sample extends HttpServlet{
private static final int int_OK = 0; // 戻り値(OK)
// private String name; // 名前
// private String db_name; // DB名前
protected void doPost(HttpServletRequest req,HttpServletResponse res)
throws ServletException, IOException{
SetterGetter setget = new SetterGetter();
// リクエストパラメータ取得
setget.name = req.getParameter("name"); // 名前
// DB検索
setget.db_name = rs.getString("name");
// 結果を返却
private class SetterGetter{
private String name; // 名前
private String db_name; // DB名前
private void setName(String name) {
this.name= name;
}
private String getName() {
return name;
}
private void setDb_name(String db_name) {
this.db_name = db_name;
}
private String getDb_name() {
return db_name;
}
}
}
以下の処理で問題なく動作しますでしょうか?
よろしくお願いします。

No.2
- 回答日時:
クラスメンバ変数でなく、doPostの中でのローカル変数にすれば、何も問題ないと思うのですが・・・?
この回答への補足
ご回答ありがとうございます。
申し訳ありません。内容に不足がありました。
すべての処理をdoPostの中で行っていたら上記の内容で良いかと思いますが、メソッドを作成して処理のやりとりを行っています。
ローカル変数にした場合、必要な情報を引数で渡さなくてはなりませんので、今回クラスメンバ変数を使用しています。
No.1
- 回答日時:
(1)
サーブレットのインスタンスは1つです。
複数から同時アクセスされると、
タイミングによってはname、db_nameの値が後から(最後に)検索された値に上書きされてしまいます。
(2)
(自信がありません。)
JavaDocには
「Servlet が一度に一つのリクエストだけを扱うことを保証します。」
とありますので、複数から同時アクセスされても、
実行されるリクエストは1つになり、変数が上書きされることはないと思います。
が、他のリクエストは、その間待つことになるので、頻繁に複数からアクセスされる場合は
パフォーマンスが落ちてしまうと思います。
Servlet API バージョン2.4では推奨されていないようです。
----------------------------------------------------------------------
SingleThreadModel がすべてのスレッドセーフの問題を解決するというわけではないことに注意してください。
例えば、SingleThreadModel の Servlet を使用する場合、複数のスレッドに対する複数の要求で、
同時にセッション属性と静的な変数にアクセスすることができます。
開発者はこのインタフェースを実装する代わりにインスタンス変数の使用を避ける、
あるいはそれらのリソースにアクセスするコードブロックを同期させるなどのように問題を解決する他の手段を取ることをお勧めします。
このインタフェースは Servlet API バージョン 2.4 では推奨されません。
----------------------------------------------------------------------
この回答への補足
ご回答ありがとうございます。
やはり(1)は予想していた通りでした。
いろいろ調べて(2)を使用しようと思ったのですが
自信がなくて質問させていただきました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Java java final 1 2022/06/10 22:49
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Ruby パイソンプログラミング 2 2022/12/03 18:44
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- PHP $_SESSIONに渡した後はそのまま使っても問題ありませんか? 3 2022/11/08 22:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オブジェクトの中のプロパティ...
-
JSPでImportエラーになります
-
enumでの要素番号から要素名の...
-
requestの値が削除されません…
-
全取得したデータをjspで順番に...
-
【struts】 ActionFormで別のAc...
-
StrutsでJSPからListを受け取り...
-
JSPでDBからデータ読み込みブラ...
-
オブジェクトの中のプロパティ...
-
データベースに変数の値を挿入
-
System.out.printlnの意味がよ...
-
System.err. printlnとSystem.o...
-
JavaScriptの変数の値が消える!?
-
動的配列が存在(要素が有る)か...
-
大量のデータを読み込んで表示...
-
ループ処理の際、最後だけ","を...
-
【SQLServer接続のJSPの記述を...
-
シフトJISのエンコード
-
Request.formの値の初期化
-
Visual C++ でコントロールを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
オブジェクトの中のプロパティ...
-
JSPでImportエラーになります
-
StrutsでJSPからListを受け取り...
-
hiddenの値が期待した値で取得...
-
JSPからServletに、テーブルに...
-
requestの値が削除されません…
-
データベースに変数の値を挿入
-
javaの環境変数の%CATALINA_HOM...
-
【Struts】bean:writeタグのpro...
-
PropertyNotFoundException解決...
-
Enumのname()とtoString()の違...
-
Java Struts ~に対するゲッタ...
-
JSPにて、変数を利用してフォン...
-
JSFタグ<h:dataTable>でヘッダ...
-
JSP DB 表示
-
enumでの要素番号から要素名の...
-
サーブレットjspで勤怠スケジュ...
-
JSPでの文字列編集出力
-
文字列の抽出とSQL表作成
-
【struts】 ActionFormで別のAc...
おすすめ情報