使用Linq to sql 一个可能导致内存溢出的写法

最近由于系统的升级,经常会做一些对大量数据的批量更新的需求,因此常写一些处理工具来运行这些更新,前几天就发现我写的小工具会在运行一段时间后出现 OutOfMemory的错误,后来发现此问题源于Linq的一点使用不当导致的,看下面一段代码:

  long lastID = 0;

            using (MainDataContext db = new MainDataContext("...."))

            {

                while (true)

                {

                    var task = from t in db.Table where t.ID > lastID select t;

       if(task.Count()==0)

        break; 

                    foreach (var atask in task)

                    {

                        //TODO 做相应处理

                    }

                }

            }

 

这样写的原因是, 想着在循环的外部创建一个MainDataContext,也就相当于保持了一个SQLServer链接,这样性能上会好一些,但DataContext这种东西是会自动保持上下文的,当我窒息了一次 select之后,虽然该变量时在while内部定义的,但在执行完相应的操作之后,这些被取出的数据并没有从数据库中移除,而是不断积累起来,这样就导致了在程序运行的过程中,内存不断的增加。

 当我修改了以上代码,把DataContext的创建放在循环内部之后,内存溢出的问题解决,而且性能上也比上面的写法好了一些。

转载于:https://www.cnblogs.com/peiyutao/archive/2010/03/26/Linq_OutOfMemory.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值