JDBCDebugger
|
JDBCDebugger
jdbcdebugger プロジェクト概要
jdbcdebuggerはJDBCドライバの動作をデバッグするためのJDBCドライバです。
既存のシステムのソースを修正することなくSQL、SQL実行時間を標準出力やファイルに出力します。
開発の動機
以前JDBCを利用するWEBアプリケーションを開発しました。その後SQLのパフォーマンスをチェックするために、SQLの実行ログを出力することになりました。
が、ソースに出力処理を追加するのは構造的にかなり大変だったため、JDBCドライバを作成しログを作成することとしました。デバッグ用としてしか利用していませんが、なかなか快適です。
ログのサンプル
このようなログを標準出力かファイルに出力します。
## JDBC Debug ## 2003/10/01 18:07:45 71ms executeQuery SELECT xxxxOID,xxxxDate FROM UserMst
2003/10/01 18:07:45 実行日時
71ms 応答時間+データ取得時間
executeQuery 実行メソッド
SELECT ... 実行SQL
導入方法
※ver0.09からjdbcdebug.propertiesを廃止しました。
全てJDBC URLでパラメータを指定します。
(1) jdbcdebug_X.XX.jar の配置<
クラスパスに jdbcdebug_X.XX.jar をコピーしてください。
JNDIを利用しない場合は
/WEB-INF/lib/jdbcdebug_X.XX.jar
等に配置します。
JNDIを利用する場合はアプリケーションサーバーのクラスパスに配置します。
例としてTOMCATの場合は
$TOMCAT_HOME/common/lib/jdbcdebug_X.XX.jar
に配置します。
(2) JDBCドライバの変更
デバッグしたいシステムでは既に Oracle 等の
ドライバを利用していると思われます。
これを JDBC Debug に変更してください。
例)
JNDIの場合も同様にドライバの指定を変更してください。
(3) 接続URLの変更
JDBC接続URLを
[実際のURL]?jdDriver=[実際のドライバ]&jdOutType=1&jdPrefix=#SQL#
に変更します。
PostgreSQLの場合)
jdbc:postgresql://129.160.48.82/FWPRJ?jdDriver=org.postgresql.Driver&jdOutType=1&jdPrefix=#SQL#
[URLオプションについて]
jdDriver 実際のJDBCドライバ。必須
jdOutType ログ出力タイプ。任意。
1:標準出力, 2:ファイル(未対応), 3:Log4J (DEBUGレベル)
jdPrefix ログ接頭辞。任意
これで完了です。
後は今まで通りシステムを実行するとSQLログが
出力されます。
※ログはSQL実行直後に出力されます。
<<<< ログフォーマット >>>>
#SQL# 2003/10/01 18:07:18 10ms executeQuery SELECT userID FROM MstUser WHERE userName = 'aaa'
#SQL# 接頭辞(jdPrefixに適当な文字を与えてください)
2003/10/01 18:07:18 ログ出力日時(SQL実行直後の日時)
0ms SQL応答時間+データ取得時間(executeQuery 等のメソッド実行時間)[ms]
executeQuery 実行メソッド名(execute, executeQuery, executeUpdate)
SELECT 以降 実行SQL
<<<< 解析クラス・メソッド >>>>
java.sql.Statement, java.sql.PreparedStatement の
SQL実行メソッド実行時にログを出力しています。
(java.sql.CallableStatement は解析していないので
ログに出力されません。)
jdbcdebug_x.xx.jar モジュールの内容
jdbcdebug_x.xx.jarは基本的に java.sql パッケージ以下のInterfaceを実装したクラス群です。
。これらはアプリケーションとOracle等のベンダー製JDBCドライバの間で動作し、
SQL実行メソッド実行時にログを出力します。
つまり、jdbcdebuggerはJDBCドライバをラップし、必要に応じて動作解析処理を追加しています。
導入前
導入後
jdbcdebugger はベンダーJDBCドライバのインスタンスをjava.sqlパッケージのインターフェイス型で保持します。
そしてコネクション、トランザクションを管理し、アプリケーションがSQL実行メソッド (executeQuery, executeUpdate) を実行すると、まず現在時刻をms単位で取得し、ベンダーのJDBCドライバにそのままSQLを渡し、SQL実行メソッド完了後の時間から応答+取得時間を計算します。そしてSQLと応答+取得時間をログに出力します。
その他はベンダーJDBCドライバにそのまま処理をポストしています。
デザインパターン的にはjdbcdebuggerがJDBCドライバをDelegateしていることになります。
サンプル
利用するアプリケーションのサンプルです。通常のJDBCサンプルと全く同じです。
。
import java.sql.*;
import java.util.Properties;
public class JDBCDebugTest002
{
public JDBCDebugTest002()
{
}
public static void main(String args[])
throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException
{
Driver db_driver = (Driver)Class.forName("jp.co.powerbeans.jdbcdebug.sql.Driver").newInstance();
Properties props = new Properties();
props.put("user", "oracle"); // user name
props.put("password", "password"); // password
Connection c = db_driver.connect("jdbc:oracle:thin:@localhost:1521:global", props);
PreparedStatement pst = c.prepareStatement("select * from softMst");
ResultSet rs = pst.executeQuery();
rs.close();
pst.close();
c.close();
}
}
動作状況
JDK1.4.0 以降対応(1.3以前は未確認)
DBMS製品名 | 動作 |
Oracle 8.1.7, 9i | ○ |
MySQL 4.0.1以降 | ○ |
PostagreSQL | ○ |
DB2 | ○ |
HSQLDB | ○ |
|
|