Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java JSP/Servlet Tomcat

Javaのフォーム認証でログインを行うと数回で固まってしまう事象の対処記録

投稿日:2021年5月21日 更新日:

<目次>

(1) Javaのフォーム認証でログインを行うと数回で固まってしまう事象の対処記録
 (1-1) 発生事象・エラーメッセージ
 (1-2) 原因
 (1-3) 対策

(1) Javaのフォーム認証でログインを行うと数回で固まってしまう事象の対処記録

(1-1) 発生事象・エラーメッセージ

フォーム認証(以下の「●前提の設定」)の設定を行い、DB接続を伴う操作を数回実施した所、リクエスト(HTTPリクエスト)の応答が無い状況がずっと続き、永久に応答が来ない事象が発生しました。

●前提の設定

 
・コネクションプールの初期設定済み
(参考)Tomcatのコネクションプールの設定手順
 
・フォーム認証のユーザ認証情報を「DataSource」で取得する設定済み
(参考)Tomcatを使ったフォーム認証でユーザ情報をデータベース管理する方法

●事象の動画

こちらが実際の事象の動画です。DB接続を伴う処理(例:ログイン処理、APIのカウントアップ処理)を数回行う中で、最初の数回は特に問題なく動作していたものの、ある回で永久に応答が返って来ない事象が発生しました。

(動画111)通常版

(動画112)ネットワークトラフィック表示あり版

目次にもどる

(1-2) 原因

コネクションプールの接続を閉じる操作(close)をせずに連続で使用したため、コネクションプールが全て埋まってしまい、ずっとコネクションの解放待ちで固まってしまっていたため。

実際にDB接続オープン/クローズで、それぞれログを出力した所、オープンの回数よりもクローズの回数が少なく、未開放のコネクションがどんどん滞留している様子が確認できました。

(図121)

目次にもどる

(1-3) 対策

DB接続を使用したら必ずclose()処理を忘れずに行う事で、この事象の発生を防止できます。

DB接続に関連する操作(Context生成、DataSource生成、getConnection、createStatementなど)は軒並みtry-catchで囲んだりしますが、そこに「finally」ステートメントを加えて最終的にDB接続をクローズする処理を加えます。こうする事でクローズ漏れがなくなり、接続の空き待ちによる無応答を防ぐ事ができます。
 
(構文)
    try{
        //# DB接続&何かしらの処理
        //#(具体的には、Connection生成⇒Statement生成⇒SQL実行しResultSetに格納など)
    } catch (SQLException e1) {
        e1.printStackTrace();
    } catch (NamingException e2) {
        e2.printStackTrace();
    } finally {
        //# DBクローズ処理
        //#(具体的には、ResultSet/Statement/Connectionの順番にクローズ)
    }

 

(サンプル)

public void DbUpdateApiUseCount (String userid) {
    int current_count = DbUserUseCount(userid);

    try{
        Context context = new InitialContext();
        DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/LoginTemplate");
        //# Connectionインスタンスの生成
        conn = ds.getConnection();
        //# Statementインスタンスの生成
        stmt = conn.createStatement();
        //# SQLの実行&ResultSetインスタンスに結果を格納
        rs = stmt.executeQuery("[実行するSQL文]");
        //# その他の付随処理(結果の取り出しなどもしあれば)
    } catch (SQLException e1) {
        e1.printStackTrace();
    } catch (NamingException e2) {
        e2.printStackTrace();
    } finally {
        DbClose();
    }
}

//# クローズ処理
public void DbClose () {
    try {
        if(rs != null) {rs.close(); System.out.println("# @@ Connection Closed @@");}
        if(stmt != null) {stmt.close();}
        if(conn != null) {conn.close();}
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

 

(図131)

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Java, JSP/Servlet, Tomcat

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

JavaScriptのAddEventListenerの用途や使用例について

<目次> (1) JavaScriptのAddEventListenerの用途や使用例について  (1-1) 概要  (1-2) 構文  (1-3) サンプルプログラム (1) JavaScriptの …

JSP/Servletでウェルカムページが認証されない事象について

<目次> (1) JSP/Servletでウェルカムページが認証されない事象について  (1-1) 発生状況・エラーメッセージ  (1-2) 原因  (1-3) 対処 (1) JSP/Servletで …

JSPのコンパイル済ファイルの格納場所(Tomcat単体の場合、Eclipse連携の場合)

<目次> (1) JSPのコンパイル済ファイルの格納場所(Tomcat単体の場合、Eclipse連携の場合)  (1-1) Tomcatを単体で使用している場合  (1-2) Eclipseとアプリケ …

JSP/Servletで値を受け渡す方法(画面に入力された値を画面遷移で渡す方法)

<目次> (1) JSP/Servletで値を渡す方法(画面に入力された値を画面遷移で渡す方法)  (1-1) 構文  (1-2) サンプルプログラム (1) JSP/Servletで値を渡す方法(画 …

Javaのメソッドで複数の戻り値を返却する方法

<目次> (1) Javaのメソッドで複数の戻り値を返却する方法  (1-1) 同じ型の値を複数返却したい場合 ⇒ 配列やList   ◎ポイント   ◎サンプル  (1-2) 異なる型の関連する値を …

  • English (United States)
  • 日本語
Top