实现惰性垃圾收集

上次修改时间: 2009年10月1日

适用范围: SharePoint Foundation 2010

当 SharePoint Foundation 不再在外部 BLOB 存储(包括活动文档、旧版本和回收站文档)中保存对 BLOB 文件的引用时,您可以删除孤立的文件。为了支持此操作,只要外部 BLOB 存储中的孤立文件比例超过您应用程序的实际限制,就可以对孤立的 BLOB 运行垃圾收集。

惰性垃圾收集

下面是使用 EBS 提供程序对外部 BLOB 存储实现垃圾收集时应该采取的步骤。有几个步骤提供了示例代码段来演示特定的任务。但是,代码示例已经过简化并假设存在以下情况:

  • 给定网站的外部 BLOB 文件存储在目录中。

  • 列表适合内存中的哈希表。

  • 垃圾收集正在运行时,不会创建任何新的 BLOB。

尽管这些假设可能不适用于您的网站,但您应该能够根据您的特殊情况调整这些示例。

重要注释重要信息

应按照所示顺序执行这些步骤,否则可能会导致有问题的竞争条件。

对外部 BLOB 存储实现垃圾收集

  1. 枚举与给定 SPSite 标识符相对应的 EBS 提供程序命名空间中的所有 BLOB 文件。将这些 BLOB 文件添加到哈希表。

    String dirName = Utility.DirFromSiteId(site.ID);
    FileInfo[] files = Directory.GetFiles(dirName);
    foreach (FileInfo file in files)
    {
        ht.Add(file.Name, file);
    }
    
  2. 找到与 SPSite 标识符相对应的内容数据库中的所有文档。从哈希表中删除这些条目。

    foreach (SPExternalBinaryId blobid in site.ExternalBinaryIds)
      {
        String fileName = Utility.FileFromBlobid(blobid);
            if (ht.Contains(fileName))
            {
                ht.Remove(fileName);
            }
      }
    
  3. 保留在该哈希表中的条目就是外部 BLOB 存储中存在,但在内容数据库中没有相应文件的文件。这些是孤立文件,可将其删除。

    foreach (FileInfo file in ht.Values)
      {
          file.Delete();
      }
    

请参阅

概念

从外部数据存储中删除孤立 BLOB

SharePoint Foundation 中二进制大型对象 (BLOB) 的外部存储

其他资源

ILockBytes