關於獲得PrepareStatement中的SQL

昨天剛完成現有將DB Query集成到咱們的perflog的功能,粒度細化到每一次executeQuery,Tim琢磨着能不能把sql也留在咱們的perflog中,他指了幾條路,我來研究這部分。記錄下研究的結果。 html

1,Java沒法經過反射獲得方法的參數值!因此經過反射拿到參數的路線不做考慮。 java

2,Java的PrepareStatement中並未包含獲得SQL參數的方法,各類輸出都是對象,一樣放棄這條路。 sql

參考各處的實現,大概有兩個思路: api

①新建MyPrepareStatement類,將SQL參數做爲變量記錄下來,或者在execureQuery時將SQL打印出來。這種改動比較大,且不適合集成到咱們的perflog中,若是僅是在serverlog中記錄的話,能夠考慮。 spa

②經過第三方的相似P6Spy等組件,修改數據源,達到檢測所有JDBC操做的功能。這種代價比較大,並且也不適合整合到咱們的perflog中。若是懶得研究相似功能的話,卻是能夠試試。 .net

ps.原來用Hibernate時,經過ShowSQL等配置,能夠打印執行的SQL參數;不知道用Hibernate/MyBatis的整合起來有多困難,可能會容易些吧。咱們要作的儘可能減小依賴和侵入,從源頭入手還真挺麻煩的。 server


下面是一些參考資料: htm

http://www.javaworld.com/javaworld/jw-01-2002/jw-0125-overpower.html 對象

http://www.javaworld.com.tw/roller/jiaming/entry/2007_4_13_PreparedStatement_Proxy_Design_Pattern blog

http://blog.csdn.net/authorzhh/article/details/6931050

http://www.blogjava.net/crazycy/archive/2006/07/22/59581.html

http://www.cnblogs.com/opaljc/archive/2012/03/10/2389351.html

http://doc.java.sun.com/DocWeb/api/java.sql.PreparedStatement

相關文章
相關標籤/搜索