各位好,我最近刚开始学习ef的使用,在使用ef执行sql语句的过程中发现ef的内存一直没释放,用例代码如下:
1 var sql = "select sum(price) from stock where code = '600000'"; 2 3 foreach (var k in Enumerable.Range(0, 1000)) 4 { 5 using (var db = new StockEntities()) 6 { 7 8 var r = db.Database.SqlQuery<decimal>(sql).Single(); 9 } 10 11 }
这是我一个测试用例的代码,执行测试用例的时候发现内存一直在增长没有释放,即使在循环体中添加GC.Collect()代码也无效。执行到最后报出内存溢出错误。
请问有朋友能解释下这是什么原因吗?我该怎样处理内存不断增长的问题?
谢谢
这个方法一结束就释放掉了
嗯,我也是这么想的,但结果是内存一直上涨没释放
StockEntities是DbContext的派生类吗?
如果是的话那就肯定是StockEntities里做了什么导致内存暴涨没释放。
起码我按你的方式跑了下是没问题的。
是自动生成的,你多次执行sql查询语句不会导致内存上涨吗?
用linq都会有内存占用高的问题.但这个不归你管..dotnet自己会管好的
这已经不是占用高的问题了,是内存一直没释放最后导致out of memory错误
@鸡蛋饭: 这种就是你EF上文管理有问题了.以前我也遇到过.解决方案就是不用EF或者上下文用using包起来
@吴瑞祥: 你看我的代码,每一次循环都有用using包起来,也试过不用using,也不行
@鸡蛋饭: StockEntities你这个是上下文?
@吴瑞祥: 是上下文。原因是由sqlite的provider引起的。后来把数据库改成sqlserver,就没有内存溢出这个问题了,代码不变
关键是你的循环体里
var db = new StockEntities()
相当于创建了1000次.把这句放到foreach外面会好很多.
原因是由sqlite的provider引起的。后来把数据库改成sqlserver,就没有内存溢出这个问题了,代码不变