`
xsldlm
  • 浏览: 22837 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ibatis 3.0 只创建不回收的BUG

阅读更多
前两天刚解决了 IBatis.NET,不要相信它,内存疯狂泄漏 的bug....决定立即升级到最近版本 3.0.
结果今天又见一个BUG.:程序运行几分钟后,出现错误(oracle):打开游标数超过最大值
很明显,打开太多的Statement而没有关闭,不多说直接看源码(本人对于这种清理不干净的问题极其过敏)

一、问题
系统运行一段时间后,报(oracle):打开游标数超过最大值
二、原因BATCH模式的executor对所有select操作产生的Statement未执行close操作
SIMPLE的CRUD不存在此问题,但BATCH的所有select操作均未close。看三个关健方法代码:
// BatchExecutor.java 文件
  public int doUpdate(MappedStatement ms, Object parameterObject)
      throws SQLException {
    Configuration configuration = ms.getConfiguration();
    StatementHandler handler = configuration.newStatementHandler(this, ms, parameterObject, RowBounds.DEFAULT, null);
    BoundSql boundSql = handler.getBoundSql();
    String sql = boundSql.getSql();
    Statement stmt;
    if (currentSql != null && sql.hashCode() == currentSql.hashCode() && sql.length() == currentSql.length()) {
      int last = statementList.size() - 1;
      // 添加 statement
      stmt = statementList.get(last);
    } else {
      Connection connection = transaction.getConnection();
      stmt = handler.prepare(connection);
      currentSql = sql;
      statementList.add(stmt);
      batchResultList.add(new BatchResult(ms, sql, parameterObject));
    }
    handler.parameterize(stmt);
    handler.batch(stmt);
    return BATCH_UPDATE_RETURN_VALUE;
  }

  public List doQuery(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler)
      throws SQLException {
    flushStatements();
    Configuration configuration = ms.getConfiguration();
    StatementHandler handler = configuration.newStatementHandler(this, ms, parameterObject, rowBounds, resultHandler);
    Connection connection = transaction.getConnection();
    Statement stmt = handler.prepare(connection);
    handler.parameterize(stmt);
    try{  // 在这里添加两行代码,以close相关Statement
    return handler.query(stmt, resultHandler);
    }finally{ closeStatement(stmt); } //  add end.
  }

  // 这个方法在 commit 时会调用
  public List<BatchResult> doFlushStatements() throws SQLException {
    List<BatchResult> results = new ArrayList<BatchResult>();
    try {
      for (int i = 0, n = statementList.size(); i < n; i++) {
        Statement stmt = statementList.get(i);
        BatchResult batchResult = batchResultList.get(i);
        。。。。。省
        results.add(batchResult);
      }
      return results;
    } finally {
      for (Statement stmt : statementList) {
        // 在这里 close 批处理所用的 Statement
        closeStatement(stmt);
      }
      currentSql = null;
      statementList.clear();
      batchResultList.clear();
    }
  }


三.解决方法
上面代码已经给出相关说明。Batch模式对于更新操作会在commit时关闭,而 batch 模式对于select 操作是无效的,我们应该在做完select操作后直接将其close
分享到:
评论
3 楼 greathjt 2010-09-27  
嗯,我明白了。可是不解的是:ReuseExecutor.doQuery方法是否也要做同样的修改?
2 楼 xsldlm 2010-09-27  
也许是你看错了。
BatchExecutor.query-->flashStatements-->doFlashStatements

BaseExecutor.commit-->flashStatements-->doFlashStatements
1 楼 greathjt 2010-09-27  
你好,最近我读ibatis代码到此处,不是很明白doFlushStatements这个方法的用途,我发现只在BatchExecutor的query方法中调用了该方法,其他的executor类的query方法中没有对此调用,请告知?
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    最新的ibatis 3.0(包含源码)

    然而,由于“最新的ibatis 3.0”不兼容Spring 3.0.1,这意味着在使用这两个框架集成时可能会遇到问题。Ibatis的依赖注入和Spring的依赖注入可能存在冲突,或者某些API可能不匹配。为了解决这个问题,开发者可能需要...

    ibatis3.0示例

    《深入解析iBatis 3.0:基于mybatis-jpetstore-6.0.1示例》 iBatis,又称MyBatis,是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。iBatis 3.0版本(也称为MyBatis 3.0)引入了许多新特性,极大地...

    ibatis3.0+jsp(demo)

    要运行这个"ibatis3.0+jsp(demo)"项目,首先需要搭建Java Web环境,如Tomcat服务器,然后配置好数据库连接,导入数据库脚本创建的表。接着,将项目部署到服务器,并通过浏览器访问JSP页面进行交互,查看数据库操作的...

    ibatis3.0中文版文档

    ibatis3.0的中文版文档,pdf格式,很适合ibatis学习使用

    配置ibatis3.0时,发生的小错误

    在配置iBatis3.0时,可能会遇到各种小错误,这些错误往往由于不正确的配置、依赖缺失或者编码问题导致。以下是对这个主题的详细解释。 首先,让我们了解iBatis是什么。iBatis是一个优秀的持久层框架,它允许开发者...

    Ibatis3.0 增删改查(三)

    在本教程中,我们将深入探讨Ibatis 3.0框架中的增、删、改、查操作,这是关于Ibatis 3.0系列教程的第三部分。Ibatis 是一个优秀的持久层框架,它允许开发者将SQL语句直接写在XML配置文件中,与Java代码解耦,提高了...

    ibatis3.0中in的用法

    ### ibatis3.0中`in`的用法详解 #### 一、引言 在进行数据库查询时,经常会遇到需要根据多个值进行查询的情况,这时`IN`语句就显得尤为重要。`IN`语句可以用于判断某个字段的值是否在一个指定的列表之中,非常适用...

    ibatis3.0中文文档和英文文档

    本文将深入探讨Ibatis3.0的核心知识点,包括其设计理念、配置、SQL映射文件、动态SQL、事务管理以及与Spring的整合。 1. **设计理念**:Ibatis的目标是简化数据访问层的开发,将SQL语句和Java代码分离,通过XML或...

    ibatis 3.0 使用参考

    介绍了ibatis3.0的配置技巧,包括比较复杂的sql语句的写法。

    Ibatis3.0 增删改查(二)

    Ibatis3.0是Mybatis的前身,它提供了一种灵活的方式来映射SQL语句,使得数据库交互变得更加简单。在这个“增删改查(二)”的主题中,我们将继续上一部分的内容,详细介绍如何执行数据库的基本操作。 首先,我们...

    spring mvc3.0+ibatis3.0(基于oracle) Demo

    折腾了好几天,终于从零开始把spring mvc 3.0 + ibatis 3.0 (基于oracle)的Demo完全跑通了。Demo中有不少注释,使用的jar包基本是最精简的了。留着做个备用,也给大家一个参考!

    Ibatis3.0+spring2.5+strut2

    ### Ibatis3.0 + Spring2.5 + Struts2 整合实践 #### 一、项目背景与目的 在本篇文章中,我们将探讨如何将 Ibatis3.0(实际上是 MyBatis 的早期版本,这里可能是指 MyBatis 3.0)、Spring2.5 和 Struts2 这三个...

    IBatis学习

    IBatis3.0学习IBatis3.0学习IBatis3.0学习IBatis3.0学习IBatis3.0学习IBatis3.0学习IBatis3.0学习

    ibatis-3-core-3.0.0.242.jar.zip

    ibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zip

    ibatis_3.0_Dynamic_Sql_设计解析(并与2.x的差异)

    标题和描述均聚焦于ibatis 3.0 Dynamic Sql的设计解析以及它与2.x版本的差异,这是一个关于ORM(对象关系映射)框架ibatis在处理动态SQL方面的重要升级和改进的主题。以下是对该主题的深入探讨: ### 重要概念:...

    spring3.0 + ibatis+jquery+注解建立dao、service类

    在Spring 3.0中,可以使用MyBatis-Spring集成库来无缝地将iBatis与Spring结合,使得事务管理和DAO对象的创建变得简单。 **注解** 在本项目中,注解将被用来声明和配置DAO和服务类。例如,`@Repository`用于标记DAO...

    struts2_spring_ibatis3.0整合

    Struts2、Spring和iBatis是Java Web开发中常用的三大框架,它们分别负责MVC模式中的控制层、业务层管理以及数据访问层。本文将详细介绍如何将这三者进行整合,实现一个高效且灵活的Java Web应用。 Struts2是基于MVC...

    ibatis-core-3.0.jar.zip

    《深入解析iBatis核心库:ibatis-core-3.0.jar》 iBatis,一个优秀的持久层框架,以其轻量级、易用性、灵活性等特性深受开发者喜爱。在Java开发领域,iBatis作为数据访问层的解决方案,为数据库操作提供了强大的...

    Spring3.0+Ibatis+Orace全注解开发

    该文件是一个完整的Spring3.0+Ibatis+Oracle全注解式开发项目,里面详细的介绍了注解的使用,注解描述很全,下载就可以导入到您的myeclipse中运行,很好的Spring注解开发小项目

Global site tag (gtag.js) - Google Analytics