繁体   English   中英

处理不起作用,许多无效连接

[英]Dispose not working, many dead connections

自从更新到EF6以来,我遇到了奇怪的事情,不确定这是否相关,但过去一直很好

我正在做一组工作,然后将其保存到DB,然后再做一次,再保存一次。

一段时间后,我通过sp_who2检查了SQL Server,发现我的计算机有许多sp_who2连接。

任务是巨大的,然后有700个连接,我必须周期性地手动杀死它们。

程序像:

while (jobDone == false)
{
     var returnData=doOneSetJob();
     myEntity dbconn= new myEntity;

     foreach( var one in retrunData) 
     {

        dbconn.targetTable.add(one );
        try
        {  
            dbconn.savechange();
            /// even i put a dispose() here , still lots of dead connections
        }
        catch
        {
           console.writeline("DB Insertion Fail.");
           dbconn.dispose();
           dbconn= new myEntity();
         }
     }

     dbconn.dispose()
}

您应该考虑重构代码,以便在工作完成后清理连接。 例如:

using (var context = new DbContext())
{
        while (!jobDone)
        {
            // Execute job and get data
            var returnData = doOneSetJob();

            // Process job results
            foreach (var one in returnData)
            {
                try
                {
                    context.TargetTable.Add(one);
                    context.SaveChanges();
                }
                catch (Exception ex)
                {
                    // Log the error
                }
            }
        }
}

using语句将保证您的上下文被正确清理,即使您在遍历结果时发生错误。

在这种情况下,您应该使用using语句。 取自MSDN

using语句确保即使在调用对象的方法时发生异常,也将调用Dispose。 通过将对象放在try块中,然后在finally块中调用Dispose,可以达到相同的结果。 实际上,这就是编译器翻译using语句的方式。

因此,您的代码看起来像这样更好:

using(var dbconn = new DbContext())
{
    while (!jobDone)
    {
        foreach(var one in retrunData)
        {
            try
            {
                targetTable row = new TargetTable();
                dbconn.TargetTable.add(row);

                dbconn.SaveChanges();
            }
            catch (Exception ex)
            {
                Console.WriteLine("DB Insertion Fail.");
            }
        }
    }
}

这样,即使您的代码在某些时候失败了, Context ,资源和连接也将被正确处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM