2013-03-27 102 views
1

我有一种方法可以将用户的信息使用linq转换为sql类。该方法使用调用现有存储过程的linq语句执行三个查询。这里是我如何布置我的linq语句的一个例子。Linq to Sql TImeout问题

  using (var db = new TestDataContext(connection))) 
      { 
       var user = db.proc_UserInfo(userId); 

       foreach (var x in user) 
       { 
        string FullName = x.FirstName + " " + x.LastName; 
        string Address = x.Addr1; 
        string City = x.City;       
       } 
      } 

该方法通过一个web api控制器调用,该控制器从jquery ajax请求中触发。它工作正常,但是当我通过匆忙地改变完成用户的下拉列表来增加ajax请求的负载时,我注意到如果我可以做得足够快,看起来像去db的一批查询被取消并且调用被暂停几分钟,接下来的查询超时并返回空对象。有一点需要注意的是这些查询不会返回,而是返回几行数据。我仍然在试图弄清楚发生了什么事情并愿意接受建议。提前致谢。

+1

proc_UserInfo手动执行它时需要多长时间运行?执行计划是什么样的?它可能只是返回几行,但你确定你没有废弃你的表来获得这些行吗? 还要考虑到每个Ajax请求可能会导致另一个工作线程在IIS中产生,并且您可能会窒息您的SQL客户端(假设它是sql server)连接池。 另外,你可以考虑通过在你的ajax请求之前禁用下拉列表来避开这个问题,并且不要在ajax完成之前重新启用它,以阻止人们对你进行操作:) – 2013-03-27 22:12:08

+0

感谢自从我发布我一直在尝试再次打破它,没有骰子。它已经在不到一秒的时间内回复这些请求。我将禁用下拉菜单作为第二种预防措施,并尝试加载测试我的Web服务。谢谢斯蒂芬。 – vikingben 2013-03-27 23:26:12

回答

1

首先我想人们可能需要更多的信息。我假设的数据库类型是SQL Server,但你还没有列出一个版本。无论如何,这可能是一些事情。请记住,AJAX调用是以http请求/帖子的形式运行的,因此可能存在IIS超时或其他各种IIS限制。另外,你的调用是否是异步的?Jquery有一些你可能想要验证的设置。表锁定是SQL Server也是一种可能性。同时检查浏览器的ram/w3wp用法以确保它没有用完资源。

首先我建议运行SQL事件探查器来验证发生了什么,然后检查这些查询的执行计划。如果数据量很大,则可能需要一些索引。

+0

感谢Andrew的回应,我们正在运行SQL 2008服务器。我感谢SQL探查器的建议,我一定会检查这些查询。 – vikingben 2013-03-27 23:31:13