亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

IBatis.NET,不要相信它,內(nèi)存瘋狂泄漏

系統(tǒng) 2314 0
前不久為用戶(hù)做了一個(gè)小工具,把數(shù)據(jù)中心的數(shù)據(jù)發(fā)布到其它相應(yīng)的數(shù)據(jù)庫(kù).到用戶(hù)的測(cè)試機(jī)上一跑, 10分鐘左右,內(nèi)存用光(1.5G) ,跟蹤看了一下 IBATISN.NET 1.6.1 的源碼,哈哈。。。找著根了

一、根位置 MappedStatement.cs
ibaits的數(shù)據(jù)真實(shí)操作都交給了這個(gè)類(lèi)。其中用一大堆與select相關(guān)操作的方法以及insert update delete相關(guān)方法,內(nèi)存泄漏就在這些方法上。簡(jiǎn)單看一下ExecuteInsert(insert)方法的代碼:
    
// 初始化 command 的參數(shù)
_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);
}
// 下面這個(gè) finally 段是我加上去的,我不確定 command 的 dispose是否會(huì)調(diào)用相關(guān)Paramters中對(duì)象相應(yīng)的 dispose 方法,所以就用了下面這個(gè),因?yàn)槌绦蛑酗@示大量IDataParamter  對(duì)象無(wú)法回收
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 接口得顯示調(diào)用
using并不能釋放這些非托管資源
三、解決方法:看上面代碼

四、總結(jié)
以前用ibaits怎么就沒(méi)有發(fā)現(xiàn)在呢?
我想這與項(xiàng)目的實(shí)際應(yīng)用場(chǎng)景有關(guān),問(wèn)題一直都存在,只是沒(méi)有顯現(xiàn)吧了。
大多數(shù)據(jù)時(shí)候,用戶(hù)的輸入?yún)?shù)只有幾個(gè),相對(duì)較少,而且調(diào)用頻度應(yīng)該不高。
而這個(gè)應(yīng)用場(chǎng)景走的卻是另一個(gè)極端:
調(diào)用頻度極高:
數(shù)據(jù)中心實(shí)時(shí)采集4家公司的數(shù)據(jù),且數(shù)據(jù)更新高峰在開(kāi)收盤(pán)前后,中午休市最為集中,每天的數(shù)據(jù)更新在3000K左右,這些數(shù)據(jù)要及時(shí)發(fā)布到5個(gè)數(shù)據(jù)庫(kù)中
參數(shù)超多:
近200張表中有50多張賬務(wù)相關(guān)的表字段個(gè)數(shù)在100到230之間

這些字段最終是要轉(zhuǎn)換成 INSERT 與 UPDATE 語(yǔ)句中的參數(shù), 怪不得程序顯示超多OarcleParamter 對(duì)象無(wú)法回收,它不多才怪。。。

不過(guò)還好,加了上面的代碼后,程序內(nèi)存近期還沒(méi)超過(guò)150M,多在100M左右

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

這個(gè)問(wèn)題其實(shí)是由 IDispose 接口引起的, 不知道JAVA是什么樣子,源碼還沒(méi)仔細(xì)看

JAVA版本的3.0出來(lái)時(shí)間也不短了,易用性比 IBATIS.NET 1.6.1 要強(qiáng)太多了。
不知道 .NET 版本的更新什么時(shí)候出。。。

IBatis.NET,不要相信它,內(nèi)存瘋狂泄漏


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 中文字幕亚洲视频 | 99在线影院 | 快播第四色| 中文有码第一页 | a毛片免费观看完整 | 中文字幕亚洲综合 | 91精品免费观看老司机 | 黄色影院在线观看视频 | 国产成人精品免费大全 | 视色视频在线观看 | 香港aa三级久久三级不卡 | 亚州在线播放 | 老司机成人午夜精品福利视频 | 性欧美视频在线观看 | 国产成人 免费观看 | 毛片网站在线 | 五月婷婷在线视频 | 综合欧美日韩一区二区三区 | 亚洲一区视频在线播放 | 奇米影视777me | 一本色道久久综合亚洲精品 | 久久亚洲精品成人综合 | 久久99国产精一区二区三区 | 久久国产精品亚洲va麻豆 | 玖玖国产精品视频 | 中文字幕在线激情日韩一区 | 99欧美精品| 女人用粗大自熨喷水在线视频 | 亚洲五月婷 | 成人伊人青草久久综合网 | 蜜桃精品免费久久久久影院 | 国产日产久久高清欧美一区 | 国产69精品久久久久99 | 中文字幕一区二区视频 | 亚洲国产香蕉视频欧美 | 日韩精品麻豆 | 中文字幕免费观看视频 | 偷偷鲁国内视频视频在线 | 久久久这里只有免费精品2018 | 五月婷婷六月激情 | 国产激情自拍视频 |