Ibatis 2.x日志记录(SQL调试)分析

Ibatis 2.x日志记录(SQL调试)分析

最近的项目使用的是旧的ibatis2.x版本,有时候为了方便调试,想输出SQL执行的语句和参数。我记得应该有某些logger的日志级别修改为DEBUG就可以看到。当然为了方便可以直接在log4j(如果使用log4j的话)的root日志级别修改为DEBUG,并且输出appender的接受级别修改为DEBUG就可以了。这样是可以看到日志信息(SQL/参数)等,但是同时也输出了过多的其它logger信息,显然在一个稍微大一点的系统里面debug的信息应该都是非常多的,不说别的,光是spring的日志就够好多页了。

为了解决过多的日志,翻出ibatis源码,看了下。ibatis的执行流程大致是这样的。

Ibatis 2.x日志记录(SQL调试)分析_第1张图片

执行步骤如下:

  1. 通过SqlMapClient执行query/execute操作;
  2. 打开一个SqlMapSession会话(openSession());
  3. 设置数据源(DataSource)或者外部给的java.sql.Connection;
  4. 通过java.sql.Connection和外部给的Transaction(如果有的话)构造事务;
  5. 如果java.sql.Connection的日志级别为DEBUG,构造一个带日志记录的ConnectionLogProxy(是java.sql.Connection的一个Proxy);
  6. 在ConnectionLogProxy中构造一个带日志记录的PreparedStatementLogProxy(是java.sql.PreparedStatement的一个Proxy);
  7. 执行java.sql.Connection中的操作(如果是ConnectionLogProxy就记录连接日志);
  8. 执行java.sql.PreparedStatement操作(如果是PreparedStatementLogProxy就记录操作记录,包括SQL信息)。

我们看三段代码:

 

Ibatis 2.x日志记录(SQL调试)分析_第2张图片

Ibatis 2.x日志记录(SQL调试)分析_第3张图片

Ibatis 2.x日志记录(SQL调试)分析_第4张图片

 

 

第一段代码可以看到,要想记录日志的前提是java.sql.Connection的logger的级别是DEBUG或者更低。

第二段代码可以看到,要想记录PreparedStatement的日志,那么比如满足上述第一段代码的条件。这里会记录连接Connection打开的相关信息,比如是否是新开的Connection,这可以从id中分析出。ConnectionLogProxy是java.sql.Connection的一个Proxy实现。

第三段代码可以看到,记录PreparedStatement的日志(SQL/参数)需要java.sql.PreparedStatement的logger的级别是DEBUG或者更低。这里会记录执行的SQL、参数、参数类型等。PreparedStatementLogProxy是java.sql.PreparedStatement的一个Proxy实现。

因此要显示执行的SQL、参数、参数类型以及连接信息等需要配置两个日志级别为DEBUG或者更低。

对于log4j来说增加以下两项就可以了(如果是properties文件的话,xml修改对应规则):

log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

 

上面第二段代码中如果看的够仔细的话可以发现有一个ResultSetLogProxy的代理,配置这个相关的日志级别后可以输出执行结果信息。有兴趣的可以看看吧。



©2009-2014 IMXYLZ
imxylz.com
| 求贤若渴

你可能感兴趣的:(Ibatis 2.x日志记录(SQL调试)分析)