防止将重复文档插入Lotus Notes数据库

时间:2018-06-02 09:16:01

标签: c# lotus-notes lotus

我在iis中托管了一个c#web api,它有一个post方法,它将一个文件ID列表插入到Lotus Notes数据库中。 post方法可以多次调用,我想防止插入重复的文档。

这是从帖子调用的代码(在静态类中):

lock (thisLock)
{
   var id = "some unique id";
   doc = vw.GetDocumentByKey(id, false);
   if (doc == null)
   {
      NotesDocument docNew = db.CreateDocument();
      //some more processing
      docNew.Save(true, false, false);
   }
}

即使锁定到位,我也会遇到插入重复文档的情况。是因为请求可以在新进程上执行吗?防止它发生的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您的问题是:getdocumentbykey取决于视图索引是最新的。在繁忙的服务器上,无法保证这是真的。您可以尝试调用vw.Update,但不幸的是,这不会触发视图索引的更新,因此它可能没有任何影响(它只是更新vw对象以表示后端中已更改的内容,如果后端执行了不更新,然后它什么都不做。)

您可以使用db.Search('IdField ="' & id & '"', Nothing, 0)代替,因为搜索不依赖于要重建的索引。这会稍微慢一点,但应该更准确。

答案 1 :(得分:2)

您可能希望将插入的ID存储在某个单例对象中,甚至只是静态列表。并锁定此列表 - 谁获得锁定验证它要插入的ID不存在,然后将它们添加到列表本身。

您需要将它们保留很短的时间,以便具有相同内容的2个并发帖子不会更新,而正常视图索引会更新。因此,而不是在id中存储时间戳,因此如果列表变长,您可以清除旧记录。