(0)目次&概説
(1) 仕様について
(1-1) アーキテクチャ(アプリ/DB)
(1-2) アプリの仕様概要
(1-3) データベースの仕様概要
(2) ソースコード
(3) エラー対応
(1) 仕様について
(1-1) アーキテクチャ(アプリ/DB)
(1-1-1) やり方1:アプリ内で完結させる(一時的)
こちらは本記事では深くは扱いませんのでさわり程度に書きます。
アプリ内に閉じたカウンタ(DB接続なし)の場合はサーブレット内でカウンタ用の変数を定義して、初回呼出し(initメソッド)や二回目以降呼出し(doGetメソッド)が呼ばれる度にカウンタをインクリメントして行きます。処理の概要としては次のようになるイメージです。
分類 | モジュール名 ∟メソッド名 |
処理概要 |
初回呼出し | XXXXX.java ∟init() |
①カウンタ用の変数(int型)を定義します。 ②ServeltConfigオブジェクトの「getServletContext()」メソッドを用いてServletContext型のインスタンスを作り、上記で定義したカウンタ変数をsetAttributeでセットします。 |
2回目以降呼出し | XXXXX.java ∟doGet() |
①カウンタ用の変数(int型)を定義し、getAttributeで現在のカウンタの値を取得します。 ②カウンタをインクリメントします。 ③setAttributeでインクリメントしたカウンターをセットします。 |
(図1)
>目次にもどる
(1-1-2) やり方2:データベースと連動させる(恒久的)
こちらが今回のメインテーマです。以降に記載する仕様等は全てこの「やり方2」に関する記載となります。
ユーザ画面のjsp(例:XXXX.jsp)からアクセスカウンターの役割をするサーブレット(例:AccessCounter2.java)のアクセスカウント用メソッドを呼び出します。そのメソッドの中でDBアクセスを行い、指定した画面IDのカウンターを更新・値取得を行います。
(図2)
(1-2) アプリの仕様概要
アプリケーション側の処理の概要を記載します。流れとして、大きく3つに分解しています。
① ユーザー画面
ユーザー画面のjspでアクセスカウンタ用のメソッドをコール
↓
②サーブレット(アクセスカウンター)
アクセスカウンタ用のServletでDB接続用の各種メソッド(Connection・Statement・ResultSet・Close)をコールし、指定した画面のアクセスカウンター数を取得&更新する。
↓
③DBアクセス部品
DB接続用メソッド(Connection返却)とStatement作成メソッド(Statement返却)とSQL発行&結果取得メソッド(ResultSet返却)とリソース解放メソッド(上記3つのClose)の4つを用意します。
(表)
分類 | モジュール名 ∟メソッド名 |
処理概要 |
ユーザー画面 | [ 画面ID ].jsp | (1) AccessCounterクラスをインスタンス化し、GetAccessCountメソッドを実行する事で、DBにある指定した画面のアクセス数をインクリメント(+1)
(2) getAttribute(“ABCD”)で、セットしたインクリメント後のカウンタの値を取得します。 |
サーブレット (アクセスカウンタ) |
AccessCounter2.java ∟GetAccessCount2 |
(0) DB接続&ステートメント作成 DB接続(Connection)とステートメント作成(Statement)を行います。 (1) カウンタの現在の値取得 (2) カウンタのインクリメント (3) カウンタの更新後の値取得 (4) 更新後の値をセット |
DBアクセス部品 | DbConnectUtil.java ∟DbConnect ∟DbStatement ∟DbQuery ∟DbClose |
DbConnect → Connectionオブジェクトをインスタンス化 DbStatement → Statementオブジェクトをインスタンス化 DbQuery → クエリを発行してResultSetをインスタンス化 |
(図3):(図2)を詳細化したもの
(1-3) データベースの仕様概要
DB側でやる事は、アプリからアクセスされて更新をするための、アクセスカウンターテーブルの作成です。レコードは画面単位で作成し、アクセスカウントもその単位でカウントします。
<作業の流れ>
①SEQUENCEオブジェクトの作成
工夫した点として、SEQUENCEオブジェクトを用いて「一意な連番を付与」するカラムを作成しました。目的としては、UPDATE文の作成にあたって「どのカウンターを更新すれば良いか?」のWHERE句に指定するカラムとして使うためです。例えば画面「EGDGRPMN」の連番IDは「2」なので(図3)、UPDATE文の実行時に「WHERE COUNTER_ID=’2’のような形に指定する事で、狙った画面のカウンターを更新します(実際は’2’の部分は動的に変化させますが)
CREATE SEQUENCE ACCESS_SEQ;
↓
②テーブルの作成
上記で作ったSEQUENCEオブジェクトを用いて、各画面のアクセスカウンターを保持するテーブルを作成します(CREATE TABLE文の発行)。
以下に実際のCREATE TABLE文の例を紹介します。
CREATE TABLE ACCESS_COUNTER ( COUNTER_ID NUMBER(8) ,FUNCTION_ID VARCHAR2(8) NOT NULL ,ACCESS_COUNT NUMBER(11) NOT NULL ,CONSTRAINT PK_ACCESS_COUNTER_0 PRIMARY KEY (COUNTER_ID) ) TABLESPACE RBWEGTBS;
↓
③レコードの登録
作成したテーブルに「INSERT文」でアクセスカウンターのレコードを挿入します。(図3)のように画面毎にレコードを作り、カウンターの初期値は当然ですが「0」を設定します。またCOUNTER_IDカラムには「ACCESS_SEQ.NEXTVAL」でINSERTする事で、先ほど作ったSEQUENCEに沿った連番を付与しています。
INSERT INTO ACCESS_COUNTER (COUNTER_ID,FUNCTION_ID,ACCESS_COUNT) VALUES (ACCESS_SEQ.NEXTVAL,'EGDLDNPG',0); INSERT INTO ACCESS_COUNTER (COUNTER_ID,FUNCTION_ID,ACCESS_COUNT) VALUES (ACCESS_SEQ.NEXTVAL,'EGDGRPMN',0); INSERT INTO ACCESS_COUNTER (COUNTER_ID,FUNCTION_ID,ACCESS_COUNT) VALUES (ACCESS_SEQ.NEXTVAL,'EGSGRPMN',0);
(図3)
(2) ソースコード
別記事「JSP/Servletで画面毎のアクセスカウンターを作成してみた(パート2:ソース解説編)」をご参照下さい。
(3) エラー対応
(3-1) Java.sql.SQLRecoverableException: Closed Connection
このエラーが発生した際の対応については、下記の記事にて解説しているため割愛。
Java.sql.SQLRecoverableException: Closed Connectionの対応
>目次にもどる