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

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

関連記事

JavaのBigDecimalの使い方+初期化・四則演算・余り・累乗等の主要用途も紹介

<目的> (1) JavaのBigDecimalの使い方+初期化や四則演算・桁数設定等の主要用途も紹介  (1-1) 宣言の方法  (1-2) 代表的な用途(足し算・引き算・掛け算・割り算)  (1- …

TomcatでEclipseを使う際にserver.xmlを編集しても上書きされる事象の対処方法

<目次> (1) TomcatでEclipseを使う際にserver.xmlを編集しても上書きされる事象の対処方法  (1-1) 発生状況・エラーメッセージ  (1-2) 原因  (1-3) 対処法 …

JavaでJSON形式のデータから値を抽出する方法+代表的なエラー対処も紹介

(0)目次&概説 (1) 記事の目的  (1-1) 目的 (2) JSON形式の概要  (2-1) JSON形式とは?  (2-2) JSON形式のフォーマット (3) JSON形式の抽出方法・事前準 …

CentOS7にEclipseをインストールする手順

<目次> (1) CentOS7にEclipseをインストールする手順  (1-1) JDKのインストール  (1-2) Eclipse資源のダウンロード  (1-3) Eclipseのインストール …

JSPにおけるincludeディレクティブとjsp:includeアクションの違い

<目次> (1) JSPにおけるincludeディレクティブとjsp:includeアクションの違い  (1-1) includeディレクティブ  (1-2) jsp:includeアクション  (1 …

  • English (United States)
  • 日本語
Top