前两天刚解决了
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
分享到:
- 2009-11-10 21:22
- 浏览 1433
- 评论(3)
- 论坛回复 / 浏览 (3 / 3184)
- 查看更多
相关推荐
然而,由于“最新的ibatis 3.0”不兼容Spring 3.0.1,这意味着在使用这两个框架集成时可能会遇到问题。Ibatis的依赖注入和Spring的依赖注入可能存在冲突,或者某些API可能不匹配。为了解决这个问题,开发者可能需要...
《深入解析iBatis 3.0:基于mybatis-jpetstore-6.0.1示例》 iBatis,又称MyBatis,是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。iBatis 3.0版本(也称为MyBatis 3.0)引入了许多新特性,极大地...
要运行这个"ibatis3.0+jsp(demo)"项目,首先需要搭建Java Web环境,如Tomcat服务器,然后配置好数据库连接,导入数据库脚本创建的表。接着,将项目部署到服务器,并通过浏览器访问JSP页面进行交互,查看数据库操作的...
ibatis3.0的中文版文档,pdf格式,很适合ibatis学习使用
在配置iBatis3.0时,可能会遇到各种小错误,这些错误往往由于不正确的配置、依赖缺失或者编码问题导致。以下是对这个主题的详细解释。 首先,让我们了解iBatis是什么。iBatis是一个优秀的持久层框架,它允许开发者...
在本教程中,我们将深入探讨Ibatis 3.0框架中的增、删、改、查操作,这是关于Ibatis 3.0系列教程的第三部分。Ibatis 是一个优秀的持久层框架,它允许开发者将SQL语句直接写在XML配置文件中,与Java代码解耦,提高了...
### ibatis3.0中`in`的用法详解 #### 一、引言 在进行数据库查询时,经常会遇到需要根据多个值进行查询的情况,这时`IN`语句就显得尤为重要。`IN`语句可以用于判断某个字段的值是否在一个指定的列表之中,非常适用...
本文将深入探讨Ibatis3.0的核心知识点,包括其设计理念、配置、SQL映射文件、动态SQL、事务管理以及与Spring的整合。 1. **设计理念**:Ibatis的目标是简化数据访问层的开发,将SQL语句和Java代码分离,通过XML或...
介绍了ibatis3.0的配置技巧,包括比较复杂的sql语句的写法。
Ibatis3.0是Mybatis的前身,它提供了一种灵活的方式来映射SQL语句,使得数据库交互变得更加简单。在这个“增删改查(二)”的主题中,我们将继续上一部分的内容,详细介绍如何执行数据库的基本操作。 首先,我们...
折腾了好几天,终于从零开始把spring mvc 3.0 + ibatis 3.0 (基于oracle)的Demo完全跑通了。Demo中有不少注释,使用的jar包基本是最精简的了。留着做个备用,也给大家一个参考!
### Ibatis3.0 + Spring2.5 + Struts2 整合实践 #### 一、项目背景与目的 在本篇文章中,我们将探讨如何将 Ibatis3.0(实际上是 MyBatis 的早期版本,这里可能是指 MyBatis 3.0)、Spring2.5 和 Struts2 这三个...
IBatis3.0学习IBatis3.0学习IBatis3.0学习IBatis3.0学习IBatis3.0学习IBatis3.0学习IBatis3.0学习
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版本的差异,这是一个关于ORM(对象关系映射)框架ibatis在处理动态SQL方面的重要升级和改进的主题。以下是对该主题的深入探讨: ### 重要概念:...
在Spring 3.0中,可以使用MyBatis-Spring集成库来无缝地将iBatis与Spring结合,使得事务管理和DAO对象的创建变得简单。 **注解** 在本项目中,注解将被用来声明和配置DAO和服务类。例如,`@Repository`用于标记DAO...
Struts2、Spring和iBatis是Java Web开发中常用的三大框架,它们分别负责MVC模式中的控制层、业务层管理以及数据访问层。本文将详细介绍如何将这三者进行整合,实现一个高效且灵活的Java Web应用。 Struts2是基于MVC...
《深入解析iBatis核心库:ibatis-core-3.0.jar》 iBatis,一个优秀的持久层框架,以其轻量级、易用性、灵活性等特性深受开发者喜爱。在Java开发领域,iBatis作为数据访问层的解决方案,为数据库操作提供了强大的...
该文件是一个完整的Spring3.0+Ibatis+Oracle全注解式开发项目,里面详细的介绍了注解的使用,注解描述很全,下载就可以导入到您的myeclipse中运行,很好的Spring注解开发小项目