今日の格闘

Javaのおはなし。

どうも、PreparedStatementとかでSQLを実行するとその実行したSQL文を取得するのは基本的に無理っぽい。
一応探すとこんなんとかもあるっぽいのだけれども...

JDBCの通信をインターセプトしてSQLのログをファイルに落してくれるツール「P6Spy」

とりあえず、

String SQL_SELECT_USER =
"SELECT * " +
"FROM t_hoge" +
"WHERE " +
"t_hoge.foo = ? ";

PreparedStatement st = con.prepareStatement(SQL_SELECT_USER);
st.setString(1, userId);

とかしちゃってるから、それなりに近いSQL文はわかるっちゃあわかるのだけど...ねぇみたいな。

で、いろいろ考えてみたのだけれど、ConnectionをDriverManagerから取っているとすれば

CharArrayWriter buf = new CharArrayWriter();
PrintWriter writer = new PrintWriter(buf);
java.sql.DriverManager.setLogWriter(writer);
log.debug(buf.toString());

とかやると、bufにDB稼動時のもろもろ情報が入らないかしらと 思ってみたり。まったく試してないけど。

DataSourceからConnectionを取ってるときでも 多分似たような感じで出来ないかしら...一応 setLogWriter()があったので。だめかしらん...?