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

IBatis.NET,不要相信它,内存疯狂泄漏

阅读更多
前不久为用户做了一个小工具,把数据中心的数据发布到其它相应的数据库.到用户的测试机上一跑,10分钟左右,内存用光(1.5G),跟踪看了一下IBATISN.NET 1.6.1的源码,哈哈。。。找着根了

一、根位置 MappedStatement.cs
ibaits的数据真实操作都交给了这个类。其中用一大堆与select相关操作的方法以及insert update delete相关方法,内存泄漏就在这些方法上。简单看一下ExecuteInsert(insert)方法的代码:
// 初始化 command 的参数
_preparedCommand.Create(request, session, this.Statement, parameterObject);
// 用 using 处理 command 
using (IDbCommand command = request.IDbCommand)
{
   try
    {
   if (_statement is Insert)
    {
        generatedKey = command.ExecuteNonQuery();
    }
    // Retrieve output parameter if the result class is specified
    else if (_statement is Procedure && (_statement.ResultClass != null) &&
            _sqlMap.TypeHandlerFactory.IsSimpleType(_statement.ResultClass))
    {
......// 省
    }

    if (selectKeyStatement != null && selectKeyStatement.isAfter)
    {
        IMappedStatement mappedStatement = _sqlMap.GetMappedStatement(selectKeyStatement.Id);
        generatedKey = mappedStatement.ExecuteQueryForObject(session, parameterObject);

        ObjectProbe.SetMemberValue(parameterObject, selectKeyStatement.PropertyName, generatedKey,
            request.DataExchangeFactory.ObjectFactory,
            request.DataExchangeFactory.AccessorFactory);
    }

    //ExecutePostSelect(request);
    
    RetrieveOutputParameters(request, session, command, parameterObject);
}
// 下面这个 finally 段是我加上去的,我不确定 command 的 dispose是否会调用相关Paramters中对象相应的 dispose 方法,所以就用了下面这个,因为程序中显示大量IDataParamter  对象无法回收
finally 
{  
     if (command.Parameters.Count > 0){
         MethodInfo mi = command.Parameters[0].GetType().GetMethod("Dispose", BindingFlags.Instance | BindingFlags.Public);
         if (mi != null)
             for (int i = 0; i < command.Parameters.Count; i++)
                            mi.Invoke(command.Parameters[i], null);
         }
   command.Dispose();
}
}


二、原因 IDispose 接口得显示调用
using并不能释放这些非托管资源
三、解决方法:看上面代码

四、总结
以前用ibaits怎么就没有发现在呢?
我想这与项目的实际应用场景有关,问题一直都存在,只是没有显现吧了。
大多数据时候,用户的输入参数只有几个,相对较少,而且调用频度应该不高。
而这个应用场景走的却是另一个极端:
调用频度极高:
数据中心实时采集4家公司的数据,且数据更新高峰在开收盘前后,中午休市最为集中,每天的数据更新在3000K左右,这些数据要及时发布到5个数据库中
参数超多:
近200张表中有50多张账务相关的表字段个数在100到230之间

这些字段最终是要转换成 INSERT 与 UPDATE 语句中的参数, 怪不得程序显示超多OarcleParamter 对象无法回收,它不多才怪。。。

不过还好,加了上面的代码后,程序内存近期还没超过150M,多在100M左右

如果你也有用IBAITS.NET,你可要小心了。。

这个问题其实是由 IDispose 接口引起的, 不知道JAVA是什么样子,源码还没仔细看

JAVA版本的3.0出来时间也不短了,易用性比 IBATIS.NET 1.6.1 要强太多了。
不知道 .NET 版本的更新什么时候出。。。
0
0
分享到:
评论
1 楼 zhengyutong 2009-11-07  
我K,吓了我一跳啊。

相关推荐

    IBatis.net 配置各种数据库

    IBatis 是一个基于.NET平台的持久层框架,它实现了SQL语句与.NET代码的解耦,通过XML或注解的方式将SQL与数据访问逻辑分离,提高了开发效率。其主要组成部分包括:SqlMapConfig.xml(全局配置文件)、Mapper.xml...

    ibatis.net winform搭建带数据库

    iBATIS.NET是.NET平台上的一个持久层框架,它允许开发者将SQL语句与应用程序代码分离,提高了数据库操作的灵活性和可维护性。博客链接虽然没有提供具体内容,但通常会包含详细的步骤和示例代码来指导读者如何进行...

    c# net ibatis.net 模板

    标题中的"C# .NET iBatis.NET 模板"指的是使用C#编程语言在.NET框架下集成iBatis.NET框架的模板项目。iBatis.NET是一个数据映射框架,它将SQL语句与业务逻辑代码分离,使得数据库访问更加简单灵活。这个模板可能是...

    spring.net_ibatis.net_mysq

    iBatis.NET是SQL映射框架,它将数据库操作与业务逻辑解耦,使得代码更加灵活和易于管理。而MySQL则是一种流行的开源关系型数据库管理系统,以其高性能和易用性而受到广泛欢迎。 当我们把这三个技术结合在一起时,...

    Ibatis.net学习例子以及使用教程书

    Ibatis.net是一个轻量级的持久层框架,它在.NET环境中提供了灵活的数据访问接口,能够有效地将业务逻辑和数据访问层解耦。本教程书旨在帮助开发者深入理解并熟练运用Ibatis.net,通过实例和详细讲解,使得学习过程...

    IBatis.Net for .net framework4.0

    IBatis.Net是一款针对.NET平台的高度定制化的数据访问层(Data Access Layer,DAL)框架,它在.NET社区中广受欢迎,尤其对于那些需要灵活控制SQL语句的项目。尽管IBatis.Net的官方开发在一定程度上已经停滞,但其...

    Ibatis.net+ oracle 简单事例

    Ibatis.net 是一款轻量级的持久层框架,它将SQL映射与Java代码分离,使得开发者可以更专注于业务逻辑而不必关心底层数据库操作。Ibatis.net 提供了灵活的SQL编写方式,允许在SQL语句中直接进行条件判断,大大提高了...

    IBatis.Net详细使用手册

    iBatis.Net 是一款轻量级的持久层框架,它主要负责数据库操作,尤其是在对象关系映射(ORM)方面提供了一种灵活的解决方案。相比于完全自动化处理数据操作的ORM框架如NHibernate,iBatis.Net 更加注重开发者的控制权...

    iBatis.Net 模板文件 for codesmith4.1

    iBatis.Net是一款轻量级的ORM(对象关系映射)框架,专为.NET环境设计,用于简化数据库操作。在给定的“iBatis.Net 模板文件 for codesmith4.1”中,我们可以看到一系列与iBatis.Net集成的Codesmith模板,这些模板是...

    ibatis.net Demo

    `ibatis.net` 是一款轻量级的、开源的.NET数据访问层(Data Access Layer,DAL)框架,它提供了灵活的SQL映射机制,使得开发者能够将数据库操作与业务逻辑有效地分离,提高了代码的可维护性和可扩展性。在"ibatis...

    Spring.net + iBatis.net + asp.net MVC 整合文档

    关于Spring.net + iBatis.net + asp.net MVC 整合的文档,值!

    asp.net MVC和IBatis.net整合demo程序

    这个demo程序是一个很好的学习资源,它展示了如何在ASP.NET MVC中集成Ibatis.net,帮助开发者理解这两种技术的结合方式,以及如何在实际项目中利用它们提高开发效率和代码质量。对于想要深入学习ASP.NET MVC和数据库...

    ibatis.net

    Ibatis.Net是一个基于.NET平台的轻量级持久层框架,它是Java版本的iBATIS在.NET世界中的对应实现。这个框架的主要目标是提供一个简单、高效且灵活的方式来将数据库操作映射到对象和XML配置文件,以此来减轻开发人员...

    Ibatis.net学习和实例~

    Ibatis.net是一个轻量级的持久层框架,它在.NET环境中提供了灵活的数据访问接口,能够有效地将业务逻辑和数据访问层解耦。本教程将深入探讨Ibatis.net的学习与实践,帮助开发者更好地理解和掌握这个强大的工具。 ...

    Ibatis.net

    本文将深入探讨Ibatis.net的基本概念、配置方式以及如何使用它进行数据库操作。 ### Ibatis.net简介 Ibatis.net是MyBatis的.NET版本,它允许开发者将SQL语句与业务逻辑分离,提高了代码的可维护性和可扩展性。...

    ibatis.net的asp.net MVC的实例

    在这个实例中,我们主要探讨的是如何在ASP.NET MVC框架中集成并使用ibatis.net,这是一个轻量级的数据访问层(DAL)解决方案,它允许开发者将数据库操作与业务逻辑分离,提高了代码的可维护性和灵活性。Ibatis.net...

    IBatis.NET开发文档

    iBATIS.NET是一款开源的持久层框架,它在.NET平台上为开发者提供了强大的数据访问和SQL映射功能。这个开发文档集合包含了"iBATIS SQL Maps 开发指南"、"iBATIS SQL Maps入门教程"以及"ibatis 开发指南"等资源,旨在...

    IBatis.net1.9.2&1.6.2最新版本

    IBatis 是一个流行的数据访问层(DAL)框架,它允许开发者将SQL语句与.NET应用程序中的业务逻辑分离。在.NET环境中,有两个主要版本被广泛使用:IBatis.Net 1.9.2 和 IBatis.DataMapper 1.6.2。这些版本是该框架的...

    ibatis.Net

    8. **扩展性**:Ibatis.Net的设计使得它易于与其他框架集成,如ASP.NET MVC、Nhibernate等,可以构建更复杂的系统架构。 在你提供的压缩包文件中,`Ibatis.DataMapper.1.6.2.bin`可能是Ibatis.Net的一个版本的二...

Global site tag (gtag.js) - Google Analytics