• mybatis三种执行器性能比较


    Mybatis内置的三种执行器

    public enum ExecutorType {
    SIMPLE, REUSE, BATCH
    }



    默认是SIMPLE。依次是:单次提交、复用、批量(JDBC本身就支持批量)

    SIMPLE

    [main] DEBUG [org.apache.ibatis.demo.BlogMapper.insertBlog] - ==> Preparing: insert into blog values(?,?,?)
    [main] DEBUG [org.apache.ibatis.demo.BlogMapper.insertBlog] - ==> Parameters: 80(Integer), allen(String), 2012(String)
    [main] DEBUG [org.apache.ibatis.demo.BlogMapper.insertBlog] - <== Updates: 1
    [main] DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6580cfdd]
    [main] DEBUG [org.apache.ibatis.demo.BlogMapper.insertBlog] - ==> Preparing: insert into blog values(?,?,?)
    [main] DEBUG [org.apache.ibatis.demo.BlogMapper.insertBlog] - ==> Parameters: 81(Integer), allen(String), 2012(String)
    [main] DEBUG [org.apache.ibatis.demo.BlogMapper.insertBlog] - <== Updates: 1
    [main] DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6580cfdd]

    REUSE

    [main] DEBUG [org.apache.ibatis.demo.BlogMapper.insertBlog] - ==> Preparing: insert into blog values(?,?,?)
    [main] DEBUG [org.apache.ibatis.demo.BlogMapper.insertBlog] - ==> Parameters: 0(Integer), allen(String), 2012(String)
    [main] DEBUG [org.apache.ibatis.demo.BlogMapper.insertBlog] - <== Updates: 1
    [main] DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6580cfdd]

    BATCH

    [main] DEBUG [org.apache.ibatis.demo.BlogMapper.insertBlog] - ==> Preparing: insert into blog values(?,?,?)
    [main] DEBUG [org.apache.ibatis.demo.BlogMapper.insertBlog] - ==> Parameters: 0(Integer), allen(String), 2012(String)
    [main] DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6580cfdd]
    [main] DEBUG [org.apache.ibatis.demo.BlogMapper.insertBlog] - ==> Preparing: insert into blog values(?,?,?)
    [main] DEBUG [org.apache.ibatis.demo.BlogMapper.insertBlog] - ==> Parameters: 1(Integer), allen(String), 2012(String)
    [main] DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6580cfdd]

    同样都是插入100,000条数据,对比一下三种执行器的执行时间

    [SIMPLE]

     

    [REUSE]

     

    [BATCH]

     

     

     比较一下三者的源码实现

    几种执行器的实现比较

    [SimpleExecutor]

    public int doUpdate(MappedStatement ms, Object parameter) throws SQLException {
      Statement stmt = null;
      try {
        Configuration configuration = ms.getConfiguration();
        StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null);
        stmt = prepareStatement(handler, ms.getStatementLog());
        return handler.update(stmt);
      } finally {
        closeStatement(stmt);
      }
    }

    [ReuseExecutor]

    public int doUpdate(MappedStatement ms, Object parameter) throws SQLException {
      Configuration configuration = ms.getConfiguration();
      StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null);
      Statement stmt = prepareStatement(handler, ms.getStatementLog());
      return handler.update(stmt);
    }

    [BatchExecutor]

    public int doUpdate(MappedStatement ms, Object parameterObject) throws SQLException {
      final Configuration configuration = ms.getConfiguration();
      final StatementHandler handler = configuration.newStatementHandler(this, ms, parameterObject, RowBounds.DEFAULT, null, null);
      final BoundSql boundSql = handler.getBoundSql();
      final String sql = boundSql.getSql();
      final Statement stmt;
      if (sql.equals(currentSql) && ms.equals(currentStatement)) {
        int last = statementList.size() - 1;
        stmt = statementList.get(last);
        applyTransactionTimeout(stmt);
        handler.parameterize(stmt);// fix Issues 322
        BatchResult batchResult = batchResultList.get(last);
        batchResult.addParameterObject(parameterObject);
      } else {
        Connection connection = getConnection(ms.getStatementLog());
        stmt = handler.prepare(connection, transaction.getTimeout());
        handler.parameterize(stmt);    // fix Issues 322
        currentSql = sql;
        currentStatement = ms;
        statementList.add(stmt);
        batchResultList.add(new BatchResult(ms, sql, parameterObject));
      }
      handler.batch(stmt);
      return BATCH_UPDATE_RETURN_VALUE;
    }

    REUSE是Statement不会执行一次就关闭,BATCH是使用JDBC的addBatch()方法提高效率

     

  • 相关阅读:
    你绝对想不到R文件找不到(cannot resolve symbol R)的原因
    你绝对想不到R文件找不到(cannot resolve symbol R)的原因
    如何安装gulp
    简单实现IE9及以下对placeholder的兼容性
    vue 新闻列表滚动效果
    2018数据技术嘉年华-金融峰会·重庆站即将起航!
    高手过招:用SQL解决环环相扣的刑侦推理问题(罗海雄版本)
    实战课堂:为什么更换存储之后一切正常但RAC集群启动不了?
    MySql避免重复插入记录方法(ignore,Replace,ON DUPLICATE KEY UPDATE)
    Druid数据库连接池和Druid内置监控系统简单介绍
  • 原文地址:https://www.cnblogs.com/yibao/p/14157704.html
Copyright © 2020-2023  润新知