(转)logback 打印Mybitis中的sql执行过程

场景:在程序开发过程中经常需要跟踪程序中sql语句的执行过程,在控制台打印出sql语句和对应的参数传递就能够更快的定位错误!

原文出处:http://www.cnblogs.com/beiyeren/p/4196134.html

这里所采用的日志框架为logback

1 不同版本的Mybitis对应不同的控制策略

1.1 myBatis3.0.6左右的版本时

打印sql的时候只需要配置如下属性:

<logger name="java.sql.Connection" level="DEBUG" />
<logger name="java.sql.Statement" level="DEBUG" />
<logger name="java.sql.PreparedStatement" level="DEBUG" />

源码解析:

PreparedStatementLogger里面看这个log.isDebugEnabled()
public Object invoke(Object proxy, Method method, Object[] params) throws Throwable {
    try {
      if (EXECUTE_METHODS.contains(method.getName())) {
        if (log.isDebugEnabled()) {
          log.debug("==>  Executing: " + removeBreakingWhitespace(sql));
          log.debug("==> Parameters: " + getParameterValueString());
        }
        clearColumnInfo();
        if ("executeQuery".equals(method.getName())) {
          ResultSet rs = (ResultSet) method.invoke(statement, params);
          if (rs != null) {
            return ResultSetLogger.newInstance(rs);
          } else {
            return null;
          }
        } else {
          return method.invoke(statement, params);
        }
      }

这个log定义的是PreparedStatement

private static final Log log = LogFactory.getLog(PreparedStatement.class);

1.2 在myBatis3.2.7左右版本(以上也可以)

只需要简单的两步即可!

更改了打印Sql的模式,它将sql打印细化到了每一个mapperStatement的每一个方法上。

如果你打算有一个全局配置打印所有的sql,则需要如下配置

在mybatis的configuration中增加setting配置

<settings>
        <setting name="logPrefix" value="dao."/>
</settings>

然后增加配置

<logger name="dao" level="DEBUG"/>

源码解析:

ConnectionLogger
public Object invoke(Object proxy, Method method, Object[] params)
      throws Throwable {
    try {
      if (Object.class.equals(method.getDeclaringClass())) {
        return method.invoke(this, params);
      }
      if ("prepareStatement".equals(method.getName())) {
        if (isDebugEnabled()) {
          debug(" Preparing: " + removeBreakingWhitespace((String) params[0]), true);
        }
        PreparedStatement stmt = (PreparedStatement) method.invoke(connection, params);
        stmt = PreparedStatementLogger.newInstance(stmt, statementLog, queryStack);
        return stmt;
      }

其中的isDebugEnabled()指的是

protected boolean isDebugEnabled() {
    return statementLog.isDebugEnabled();
}

注意这里的statementLog,看SimpleExecutor的prepareStatement(handler, ms.getStatementLog());

public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
    Statement stmt = null;
    try {
      Configuration configuration = ms.getConfiguration();
      StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);
      stmt = prepareStatement(handler, ms.getStatementLog());
      return handler.<E>query(stmt, resultHandler);
    } finally {
      closeStatement(stmt);
    }
  }

这个statementLog是ms.getStatementLog()而来的。而MappedStatement的StatementLog

String logId = id;
 if (configuration.getLogPrefix() != null) logId = configuration.getLogPrefix() + id;
 mappedStatement.statementLog = LogFactory.getLog(logId);

这里可以看到,logPrefix决定了所有log前缀,所以只需要配置logPrefix就行了

时间: 2024-10-11 13:01:08

(转)logback 打印Mybitis中的sql执行过程的相关文章

SQL执行过程中的性能负载点

一.SQL执行过程 1.用户连接数据库,执行SQL语句: 2.先在内存进行内存读,找到了所需数据就直接交给用户工作空间: 3.内存读失败,也就说在内存中没找到支持SQL所需数据,就进行物理读,也就是到磁盘中查找: 4.找到的数据放到内存中,在内存进行数据过滤再放到会话工作空间. 5.假设会话工作空间需要暂存结果集进行排序,但空间不足的话,就会借用磁盘tmpdir,最后再将结果返回给用户. 注: 用户会话空间是内存中分配出来的一个工作空间,而innodb_buffer_pool是innodb存储引

RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-&gt;新增记录SQL执行过程

有时我们需要记录整个系统运行的SQL以作分析,特别是在上线前这对我们做内部测试也非常有帮助,当然记录SQL的方法有很多,也可以使用三方的组件.3.2版本我们在框架底层新增了记录框架运行的所有SQl过程保存到用户指定的地方以便分析查看,只需要在配置文件把配置项"LogSQL"设置为True即可.框架会自动记录各常用数据库如:Oracle.SqlServer.MySQL等的操作情况. 一.Web记录Sql执行情况 1.在我们的Web项目中要记录SQL可以在Web的配置文件中设置LogSql

oracle &nbsp; SQL执行过程

1.sql执行过程 1>解析(判断对象是否存在,是否有权限查询,语义解析,检查缓存中是否有相同的SQL等等) 2>优化(CBO确定优化模式,确定访问路径,联接顺序,过程中通过很多综合因素估算出各种方式的资源消耗,选择消耗最小为优) 3>生成QEP(Query Execution Plan:查询执行计划) 4>执行QEP,返回结果

SQL监控:mysql及mssql数据库SQL执行过程监控审计

最近生活有很大的一个变动,所以博客也搁置了很长一段时间没写,好像写博客已经成了习惯,搁置一段时间就有那么点危机感,心里总觉得不自在.所以从今天起还是要继续拾起墨笔(键盘),继续好好维护这个博客,写出心里最真实的想法,写出平时接触到的一些人和事以及一些新的技术.当然写博客也不是单纯的为了记录,也想通过博客来结交更多的朋友,今天在公司图书馆看到一句话大致说的是“在今天这个年代,已经很难等到三顾茅庐,诸葛亮也需要博客.微博和影响力”,在一年前就曾想过写一篇关于怎样通过博客来提高个人影响力的文章,我会尽

Mysql体系结构及sql执行过程总结

Mysql体系结构及sql执行过程总结 一.体系结构图 各模块说明: 1.Connectors:各应用程序与SQL的交互 2. Management Serveices & Utilities:系统管理和控制工具 3.Connection Pool:连接池 管理缓冲用户连接,线程处理等需要缓存的需求 4.SQL Interfaces:SQL接口 接受用户的SQL命令,并且返回用户需要查询的结果.例如select from就是调用SQL Interface 5.Parser:解析器 (1)将SQL

SQL执行过程

一般来说,数据库处理SQL都会经过三个过程:分析.执行.返回结果,比如COGNOS ReportNet通过拖放式完成表现层后,还是会自动生成SQL,然后将SQL传递到ORACLE进行处理. 1.分析 分析是处理SQL语句的第一步,它是SQL语句处理过程较为重要的一步,它又包含几个方面: (1)语法分析,oracel是采用数据库常用的自底向上的分析方法,包含检查语法规范,命名规范,它是处理SQL语句中最消耗时间且代价最高的步骤,主要表现在绑定变量和存储过程等方面: A.绑定变量:这也是为什么使用在

MVC中Action的执行过程

接着上一篇:MVC控制器的激活过程 一.代码现行,该伪代码大致解析了Action的执行的过程 try { Run each IAuthorizationFilter's OnAuthorization() method if(none of the IAuthorizationFilters cancelled execution) { Run each IActionFilter's OnActionExecuting() method Run the action method Run ea

plsql中查看sql执行计划

想要优化sql语句,可以从sql执行计划入手. 在plsql客户端,提供了一个方便的按钮来查看执行计划 选中需要查看的sql语句,点击此按钮,就可以看到该条语句的执行计划了. 结果集包括描述,用户,对象,花销等,和功能相同的sql语句比较花销就能看出哪条sql的性能更优.

详细解密FineReport中的报表执行过程

在报表开发工具FineReport中,报表的执行过程大体可分为两步:1.报表计算:2.页面转换. 报表计算过程:先读取我们的sql语句,将完整的sql语句传至数据库服务器,由数据库返回数据给报表服务器,报表服务器进行数据列的扩展.汇总.关联.公式运算等计算,最终生成报表结果. 页面转换过程:报表计算完成后生成xml页面,需要转换为html页面才能在浏览器中查看. 针对这一过程FineReport是可以实时监控的.监控方法是将服务器的log输出级别设为“普通信息”,就能在控制台上看到每一步使用的时