最近的项目使用的是旧的ibatis2.x版本,有时候为了方便调试,想输出SQL执行的语句和参数。我记得应该有某些logger的日志级别修改为DEBUG就可以看到。当然为了方便可以直接在log4j(如果使用log4j的话)的root日志级别修改为DEBUG,并且输出appender的接受级别修改为DEBUG就可以了。这样是可以看到日志信息(SQL/参数)等,但是同时也输出了过多的其它logger信息,显然在一个稍微大一点的系统里面debug的信息应该都是非常多的,不说别的,光是spring的日志就够好多页了。
为了解决过多的日志,翻出ibatis源码,看了下。ibatis的执行流程大致是这样的。
执行步骤如下:
- 通过SqlMapClient执行query/execute操作;
- 打开一个SqlMapSession会话(openSession());
- 设置数据源(DataSource)或者外部给的java.sql.Connection;
- 通过java.sql.Connection和外部给的Transaction(如果有的话)构造事务;
- 如果java.sql.Connection的日志级别为DEBUG,构造一个带日志记录的ConnectionLogProxy(是java.sql.Connection的一个Proxy);
- 在ConnectionLogProxy中构造一个带日志记录的PreparedStatementLogProxy(是java.sql.PreparedStatement的一个Proxy);
- 执行java.sql.Connection中的操作(如果是ConnectionLogProxy就记录连接日志);
- 执行java.sql.PreparedStatement操作(如果是PreparedStatementLogProxy就记录操作记录,包括SQL信息)。
我们看三段代码:
第一段代码可以看到,要想记录日志的前提是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
|求贤若渴