【问题标题】:Are Views in Domino Thread Safe?Domino 线程中的视图是否安全?
【发布时间】:2012-01-31 14:22:08
【问题描述】:

据我了解,如果我使用 db.getView() 从数据库打开视图,则从不同线程多次执行此操作毫无意义。

但是假设我有多个线程使用 getAllDocumentsByKey() 搜索视图这样做是否安全并并行迭代 DocumentCollections?

此外,Document.recycle() 与 DocumentCollection 混淆,如果两个线程搜索相同的值并在其集合中具有相同的结果,这是否会相互混淆?

注意:我刚刚开始对此进行深入研究,但认为在这里记录是一件好事,也许我会很幸运,有人会给出答案。

【问题讨论】:

  • 你问的是Java类还是COM类?
  • 我想我并不清楚。我说的是 JAVA API
  • Java API 会同步操作,但当您的代码更改与数据库对象相对应且跨线程在 Java 对象之间共享的 C API 对象的状态时,很容易出现问题。我认为 getAllDocumentsByKey 操作对您来说是安全的,但考虑到幕后发生的同步,我怀疑您会从这种方式的多线程中获得很多优势。我可能只有一个线程进行搜索并将集合分派给工作线程。

标签: lotus-notes lotus-domino


【解决方案1】:

Domino Java API 不喜欢跨线程共享对象。如果您在一个线程中 recycle() 一个视图,它将删除引用该视图的所有对象的后端 JNI 引用。

所以你会发现你的其他线程被打破了。

Bob Balaban 写了一系列非常好的关于 Java API 如何工作和回收的文章。这是其中一部分的链接。

http://www.bobzblog.com/tuxedoguy.nsf/dx/geek-o-terica-5-taking-out-the-garbage-java?opendocument&comments

【讨论】:

    【解决方案2】:

    每个线程都有自己的DocumentCollection 对象的副本,该对象由getAllDocumentsByKey() 方法返回,因此不会出现任何线程问题。 recycle() 方法将释放对象上的内存,而不是 Document 本身,因此也不会有任何线程问题。

    您最可能遇到的问题是,如果您在一个线程中删除集合中的文档,然后尝试在另一个线程中访问该文档。您将收到“文档已被删除”错误。您必须为这些类型的错误做好准备并优雅地处理它们。

    【讨论】:

      猜你喜欢
      • 2012-08-21
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 2019-11-21
      • 2013-12-30
      相关资源
      最近更新 更多