[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 に変更してください。 例) 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 は解析していないので ログに出力されません。) 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("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(); } } 動作状況JDK1.4.0 以降対応(1.3以前は未確認)
DBMS製品名 動作 Oracle 8.1.7, 9i ○ MySQL 4.0.1以降 ○ PostagreSQL ○ DB2 ○ 要望・参加SourceForge.jp で公開していますのでご自由に試してみてください。
また、開発者の参加もお待ちしています。
何か要望がありましたら気軽にメールしてください。
2005 PowerBeans 門田 (旧AMsoft) (monden@powerbeans.co.jp)