【问题标题】:Time out retrieving items from list从列表中检索项目超时
【发布时间】:2011-01-26 06:39:17
【问题描述】:

我在从相当大的列表中检索项目时遇到问题。我可以快速轻松地从包含或多或少 50 个项目的小列表中检索项目,但是当我尝试从包含或多或少 4600 个项目的列表中检索项目时,sqlsever.exe 进程在请求期间会出现峰值,但是永远不会检索项目。如果已经设置了 Web 应用程序限制设置,那么它不可能是导致问题的原因。这是我最初用于检索项目的代码。它真的没有什么特别的。

using (SPSite site = new SPSite(siteUrl))
{
 using (SPWeb web = site.OpenWeb())
 {
  SPList list = web.Lists[uid.ToString()];
  SPListItemCollection itemCollection = list.Items;

  foreach (SPListItem i in itemCollection) //This is where the code stops responding
  {
   //Use list items
  }
 }
}

在那之后不起作用,我尝试了其他几种方法来从列表中检索项目。代码如下:

SPList list = web.Lists[uid.ToString()];  

SPQuery query = new SPQuery();
query.Query = "";
query.QueryThrottleMode = SPQueryThrottleOption.Override;

SPListItemCollection itemCollection = list.GetItems(query);

//The code stops here
//I added this part for interest sake, i wanted to if it was the looping that caused the problem
//It seems the when you try to access properties of the item collection that the problem occurs
int itemCount = itemCollection.Count;

foreach (SPListItem i in itemCollection) 
{
 //Use list items
}

我也试过了:

SPList list = web.Lists[uid.ToString()];
SPListItemCollectionPosition pos;
DataTable dt = list.GetDataTable(new SPQuery(), SPListGetDataTableOptions.None, out pos); //The code stops responding here

foreach (DataRow i in dt.Rows)
{
 //Use data rows 
}

有谁知道是什么导致了这个问题?

提前谢谢你!

【问题讨论】:

    标签: sql sql-server sharepoint sharepoint-2010 sql-server-2008-r2


    【解决方案1】:

    经过很长时间的努力,我们找到了解决办法。

    我们找到了这篇文章:

    http://trycatch.be/blogs/tom/archive/2009/04/22/never-turn-off-quot-auto-create-amp-auto-update-statistics-quot.aspx

    我们对其进行了测试,它确实有效!!!

    所以我们要做的就是将“自动创建统计信息”和“自动更新统计信息”切换为 true,问题就解决了

    感谢大家的回复

    【讨论】:

    • 链接不再可用
    【解决方案2】:

    如果您总是尝试通过list.Itemslist.GetItems(query)(使用空查询)检索所有项目,您将杀死您的服务器。

    您需要定义相关查询,并通过 SPQuery 的 RowLimit 属性指定要检索的结果数量

    SPQuery query = new SPQuery();
    query.Query = "<OrderBy><FieldRef Name='Title' /></OrderBy>"; // any relevant query here
    query.RowLimit = 50;
    

    如果不这样做,将在任何其他操作之前加载内存中的所有项目。当它尝试加载所有这些数据时,您可能会杀死您的应用程序池可用内存或 sql server 内存!

    希望有所帮助。

    【讨论】:

    • 我理解需要从列表中仅检索相关行以节省资源,但在此特定情况下,我们需要检索列表中的所有项目。我们在不久前构建的缓存框架中使用此代码。它所做的是将所有项目加载到缓存中,以便我们的 Web 部件可以快速检索数据。此代码在我们的开发环境中运行良好,我们仅在客户端暂存环境中遇到此问题。我们已经与许多客户一起使用过,从未遇到过问题,其他客户的列表包含 10 000 个项目,我们在检索项目时没有问题。
    • 这就是为什么我认为这是 SQL 问题,而不是 SP 或编码问题
    • 嗯嗯很有趣。你不觉得有一些很重的项目吗(可能有些带有附件,虽然我不确定加载 SPListItem 时是否加载了附件?你检查过服务器的内存分配吗?可能是内存不足?如果这是特定于环境的(暂存,我希望在生产中不会出现这种情况)我会在我的应用程序中添加一个特定的开关,它将“批量”加载并缓存结果(例如:前 200 万,然后是 2000 直到4000,你明白了)但我仍然很确定这是一个内存问题。这是一个专用的数据库服务器吗?
    • 任何列表项上都没有任何附件。我检查了系统的内存分配,它有 4GB 的内存,只有 2.2GB 被使用。并且 SQL 可以使用的 RAM 量没有限制。不幸的是,登台和生产共享同一个专用 SQL 服务器。 SharePoint 在另一台服务器上的 VM 上运行,与我们的开发环境相同。所以他们都有同样的问题。
    • 我已经在环境中运行了一些测试。我写了一个控制台应用程序来查询我尝试缓存的列表。我只在查询一个特定列表时遇到问题。这是具有最多列和最多查找字段的最大列表。只有当我删除该列表中的所有查找字段时,我才能成功查询该列表。任何想法为什么查找字段可能会破坏网站?
    【解决方案3】:

    尝试使用CAML查询获取数据。

    获得数据后,您可以将其放入SPQuery

    【讨论】:

      【解决方案4】:

      尽量不要同时加载所有项目。您可以在 SPQuery.ListItemCollectionPosition (http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spquery.listitemcollectionposition.aspx) 的帮助下批量加载它们(页面方式)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 2016-10-15
        • 1970-01-01
        • 2014-04-10
        • 2015-04-15
        • 2020-12-14
        • 1970-01-01
        相关资源
        最近更新 更多