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

IBatis.NET,不要相信它,內存瘋狂泄漏

系統 2363 0
前不久為用戶做了一個小工具,把數據中心的數據發布到其它相應的數據庫.到用戶的測試機上一跑, 10分鐘左右,內存用光(1.5G) ,跟蹤看了一下 IBATISN.NET?。?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 版本的更新什么時候出。。。

IBatis.NET,不要相信它,內存瘋狂泄漏


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 女女女女女女bbbbbb级毛片 | 欧美日韩国产成人综合在线影院 | 好吊色青青青国产欧美日韩 | 特黄特级a级黄毛片免费观看多人 | 亚洲精品区| 精品免费久久久久久久 | 欧美熟videos肥婆 | 加勒比黑人在线 | 男任天堂2021 | 五月婷婷色网 | 日本精品久久久一区二区三区 | 一本一本久久a久久综合精品蜜桃 | 免费看a网站 | 欧美日韩国产亚洲一区二区 | 一级黄片一级毛片 | 中文婷婷 | 91精品国产91久久久久久 | 久久久久久极精品久久久 | 久草在线免费看视频 | 日韩不卡在线观看 | 日日舔 | 草的爽免费视频 | 欧美网站黄 | 高清影院|精品秒播3 | 九天玄帝诀免费完整观看 | 变态捡到女婴h养成调教 | 99久久精品免费看国产一区二区 | 亚洲 欧美 卡通 在线 另类 | 四虎影院在线观看网站 | 久久久夜间小视频 | 久久高清一区二区三区 | 精品一区二区三区在线视频观看 | 久久国产欧美日韩精品 | 免费www xxx| 亚洲自拍激情 | 在线观看国产一区二区三区99 | 97视频精品全国在线观看 | 黑人超长巨大xxxxxxx视频 | 日本一级毛片视频 | 欧美国产精品日韩在线 | 欧美白人猛性xxxxx交69 |