昨天刚完成现有将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