昨天刚完成现有将DB Query集成到我们的perflog的功能,粒度细化到每一次executeQuery,Tim琢磨着能不能把sql也留在我们的perflog中,他指了几条路,我来研究这部分。记录下研究的结果。
1,Java无法通过反射得到方法的参数值!所以通过反射拿到参数的路线不作考虑。
2,Java的PrepareStatement中并未包含得到SQL参数的方法,各种输出都是对象,同样放弃这条路。
参考各处的实现,大概有两个思路:
①新建MyPrepareStatement类,将SQL参数作为变量记录下来,或者在execureQuery时将SQL打印出来。这种改动比较大,且不适合集成到我们的perflog中,如果仅是在serverlog中记录的话,可以考虑。
②通过第三方的类似P6Spy等组件,修改数据源,达到检测全部JDBC操作的功能。这种代价比较大,而且也不适合整合到我们的perflog中。如果懒得研究类似功能的话,倒是可以试试。
ps.原来用Hibernate时,通过ShowSQL等配置,可以打印执行的SQL参数;不知道用Hibernate/MyBatis的整合起来有多困难,可能会容易些吧。我们要做的尽量减少依赖和侵入,从源头入手还真挺麻烦的。
下面是一些参考资料:
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
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