更有效地跟踪Bug——记录带有详细参数值的SQL

来源:互联网 发布:java开发网上商城步骤 编辑:程序博客网 时间:2024/05/17 22:08


在实际开发工作中,可能需要很多调试的工作,通过调试,也许能够更好地发现程序的具体问题。 
假想下,今天QA同事给你报了一个bug,当然她们不会给出具体的原因,而仅仅是给出Bug导致的果,那么你如何fix 这个 bug了,显然每个人处理问题的方法是不一样的,但是大致会这样: 问QA,为什么会出现这样的Bug啊、在什么时间什么地方出现的…? 过后你可能会装作思考状,良久后说,这不是我们的问题,是部署的问题,是DB的问题…当然你还可以聊聊天了(一般来说QA 都是 MM了^_^)…

当然这不是优秀且富有激情的程序员干的事情(也许你就是这样,不过没关系,也许大家或多或少地时候都在做同样的事情),理想的情况是能够根据QA MM 的叙述,加上查找有用的日志,能够重现并解决Bug,如果可以的话,可以和MM聊聊是如何导致这个Bug的。

在大部分的环境下,我们使用的都是很流行的框架,比如说 Hibernate,在查日志的时候,当然你会关心里面SQL的记录,不过这些SQL也许并没有实际的价值,因为它丢失了很多有用的信息。首先应该知道,如果关心Hibernate 生成的SQL,当然需要开启 Show Sql 功能(<property name="showSql" value="true" />),但是你会发现你开启后,Log记录是类似这样的insert … ? ? ?语句,当然这还是有些实用价值的,不过这些语句只能算SQL的架子,并不是一个完整可以运行的SQL,而且确实更多详细的数据,比如这里的“?”是什么。

假如你关心SQL 里面的问号(?)到底是什么的话,那么请阅读下面的内容?如果你认为这在调试过程中并没有关注过,你可以移步寻找你真正感兴趣的事情,当然还是很欢迎你继续阅读了。‘’


  1. <dependency>
  2. <groupId>com.googlecode.usc</groupId>
  3. <artifactId>jdbcdslog</artifactId>
  4. <version>1.0.6.2</version>
  5. </dependency>


  1. <!-- 数据源配置-DBCP数据库连接池 -->
  2. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  3. <property name="driverClassName" value="${jdbc.driverClassName}" />
  4. <property name="url" value="${jdbc.url}" />
  5. <property name="username" value="${jdbc.username}" />
  6. <property name="password" value="${jdbc.password}" />
  7. <property name="initialSize" value="${jdbc.initialSize}" />
  8. <property name="maxActive" value="${jdbc.maxActive}" />
  9. <property name="maxIdle" value="${jdbc.maxIdle}" />
  10. <property name="minIdle" value="${jdbc.minIdle}" />
  11. <property name="maxWait" value="${jdbc.maxWait}" />
  12. <property name="defaultAutoCommit" value="false" />
  13. </bean>
  14.  
  15. <!-- 数据源配置 -->
  16. <!-- 代理datasource,使其能够显式获取preparedStatement的参数值 -->
  17. <bean id="proxyDataSource" class="org.jdbcdslog.ConnectionPoolDataSourceProxy">
  18. <property name="targetDSDirect" ref="dataSource"/>
  19. </bean>
  20.  
  21. <!-- 配置事务管理器 -->
  22. <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
  23. <property name="dataSource" ref="proxyDataSource" />
  24. </bean>
  25.  
  26. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  27. <property name="dataSource" ref="proxyDataSource"/>
  28. </bean>


这里采用的是logback
  1. <logger name="org.jdbcdslog.ConnectionLogger" level="trace" />
  2.  
  3. <logger name="org.jdbcdslog.StatementLogger" level="trace" />
  4.  
  5. <logger name="org.jdbcdslog.SlowQueryLogger" level="trace" />
  6.  
  7. <logger name="org.jdbcdslog.ResultSetLogger" level="trace" />

最后我们一起来看看,实际项目中,用了jdbcdslog后日志的记录情况:





原创粉丝点击