2009-12-07 70 views
2

我有一台运行ASP .NET MVC 1.0 LINQ 2 SQL的LINQ to SQL抛出异常时的应力测试

我注意到一个很奇怪的问题与LINQ 2 SQL抛出异常(主要是指定投这个Web应用程序无效或序列包含多个元素)在一定的负载下。

更大的问题是,我不是在谈论真正的重型/职业压力测试......基本上我在做的是我打开FireFox和Chrome,并按住F5 10秒钟(我称这个穷人男人压力测试) - 瞧瞧;网络应用程序在接下来的两五分钟内随机抛出这些例外。如果我从IIS7重新启动应用程序(或者如果在Visual Studio下重新启动WebDev),那么立即全部恢复正常。没有发生任何事情

起初我怀疑我处理DataContext的方式,也许我应该在Global.asx的每个Application_End中处理它,但那并没有改变任何东西。

现在我有一个由所有请求使用的公共静态DataContext对象。我不会处理它或重新创建它。这是做到这一点的正确方法吗?我应该处置它吗?我应该什么时候处理它?

每个请求都会发生几件事 - 例如,在每个页面中,User对象(对于当前用户)从数据库加载,并且“LastSeen”属性更新为DateTime.Now。其他东西(例如标签云)被缓存。

任何想法为什么会发生这种情况?

+0

你准确地得到了哪些例外?你介意在你的问题中包括他们,这可能会帮助人们了解什么是错的... – 2009-12-07 08:49:57

回答

4

DataContext类不是线程安全的 - 您需要为每个操作创建一个新的。请参阅Rick Strahl撰写的文章(Linq to SQL DataContext Lifetime Management

+1

谢谢!我现在正在为每个工作单元*创建一个DC,并且其工作完美无瑕。 – ANaimi 2009-12-07 09:47:28

+0

这就是它的设计。 msdn页甚至使用术语“工作单元” - http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.aspx – 2009-12-07 12:49:44

3

你应该查询每一堆后处置的datacontext,并使用它像

using(MyDataContext dc = new MyDataContext()) 
{ 
    var x = dc.Table.Single(a=>a.Id=3); 
    //do some more related stuff, but make sure your connection won't be open too long 
} 

不要有一个静态的DataContext由每一个请求使用。你会使用正常的ADO.Net中的每个请求相同的连接对象?!


参见http://blog.codeville.net/2007/11/29/linq-to-sql-the-multi-tier-story/

的DataContext不是线程安全的,据 我所知

你失去隔离和时的SubmitChanges()是 叫 无法控制 - 并行请求将 互相干扰

内存 泄漏很可能

+0

Downvote的原因是什么? – 2009-12-07 10:03:50

+0

处置区议会没有帮助 – 2009-12-08 16:59:04

1

为像Rob建议的每项操作创建一个DC,或者使用IoC容器为每个请求共享一个DC。

不要处理DC的 - 他们被设计为轻量级。处置不仅是不必要的,但它可能会导致不好的做法,并可能在未来导致其他线程问题,这可能更难以追查。