[jdbcdebugger]プロジェクトについて

  1. jdbcdebugger プロジェクト概要
    jdbcdebuggerはJDBCドライバの動作をデバッグするためのJDBCドライバです。
    既存のシステムのソースを修正することなくSQL、SQL実行時間を標準出力やファイルに出力します。
  2. 開発の動機
    以前JDBCを利用するWEBアプリケーションを開発しました。その後SQLのパフォーマンスをチェックするために、SQLの実行ログを出力することになりました。
    が、ソースに出力処理を追加するのは構造的にかなり大変だったため、JDBCドライバを作成しログを作成することとしました。デバッグ用としてしか利用していませんが、なかなか快適です。
  3. ログのサンプル
    このようなログを標準出力かファイルに出力します。

    ## 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
  4. 導入方法
    ※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 に変更してください。
    
    例)
    Driver=oracle.jdbc.driver.OracleDriver
    	↓
    Driver=jp.co.powerbeans.jdbcdebug.sql.Driver
    
    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 は解析していないので
    ログに出力されません。)
    
  5. 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していることになります。
  6. サンプル
    利用するアプリケーションのサンプルです。通常の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("ams.com.ams.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();
        }
    }
    
  7. 動作状況
    JDK1.4.0 以降対応(1.3以前は未確認)
    DBMS製品名動作
    Oracle 8.1.7, 9i
    MySQL 4.0.1以降
    PostagreSQL
    DB2
  8. 要望・参加
    SourceForge.jp で公開していますのでご自由に試してみてください。
    また、開発者の参加もお待ちしています。

    何か要望がありましたら気軽にメールしてください。

2005 PowerBeans 門田 (旧AMsoft) (monden@powerbeans.co.jp)