NotesDocument对象与数据库和内存之间的区别?

时间:2014-11-07 16:20:14

标签: java lotus-domino

我注意到在我的一个Java代理中,当在Hashmap中存储大量Document对象时,我得到了OutofMemoryException。 我想要实现的是:

我想用来自Oracle数据库的信息填充我的Domino数据库。逻辑是从Oracle获取所有文件,然后从Domino数据库获取所有文档。 Oracle中的所有新内容都将被保存,所有不在Oracle中但在数据库中的所有内容都将从Domino中删除。你会复制一下......

我首先循环Domino数据库中的所有文档,并将它们存储在HashMap中,其中UNID为键,Document对象为value:

dominoHash.put(doc.getUniversalId(), doc);

然后我循环结果集并创建内存中的Document对象:

Document doc = db.createDocument();
doc.replaceItemValue("MyField", rset.getString("MYCOLUMN");
oracleHash.put(rset.getString("UNID"), doc);

在我的TEST环境中,我有+20000 Domino文档,在Oracle中也是如此。在这种情况下,它们是相同的。 即使我已将代码中的所有Domino文档逻辑排除在“保存内存”之外,尝试存储在oracleHash中时也会发生OutOfMemoryException ......

我认为我存储在不同Hashmaps中的对象是相同的,但有些不同。我可以将我的Domino Document对象成功存储在Hashmap中,但不能存储在我的Oracle文档对象中。

更奇怪的是,从Domino存储的文档中包含的字段多于Oracle视图中的列。

为什么会出现这种情况?

在这个特定情况下,我使用的是org.openntf.domino API,还没有尝试使用原生API。

2 个答案:

答案 0 :(得分:1)

将所有Domino文档保留在内存中并不是一个好主意。在某些时候,你会耗尽核心API中的C句柄。

您可能希望/需要更改您的方法。一旦达到"尺寸",试图将所有内容保存在内存中总会耗尽内存。你需要的是@Andre Guirard恰当地命名,"海盗算法":

在Domino和Oracle中分别使用比较键(我从代码中理解的UNID)排序的视图。假设N是Notes而O是Oracle。你的代码(这里是伪代码)大致如下:

         OEntry = O.getFirst
         for all NEntry in N
             if NEntry.key > OEntry.key
                InsertFromOracle until NEntry.key = OEntry.key
             else if Nentry.key < OEntry.key
                DeleteFromNotes until NEntry.key = OEntry.key
             else
                SyncValuesFromOracleToNotes
             end if
          end for
         if O.hasMoreEntries
             InsertFromOracle until not O.hasMoreEntries
         end if

InsertFromOracle当然需要检查Oracle中是否还有元素可以做到这一点。

安德烈写了一个LotusScript example(找海盗代理人,以海盗的招摇行走命名)

您不需要将整个表格或文档集合保留在内存中。由于加载和比较在单个循环中运行,因此它也应该运行良好。

告诉我们它是怎么回事!

答案 1 :(得分:0)

如果这是一个XAgent,并且当多个会话正在点击或正在运行多个请求时您正在获取OutOfMemoryExceptions,则很可能会使用持久性。页面的许多会话/实例可能会被保存在内存中,导致它每次都会添加到上一次调用页面的内存中,这就是导致最终OutOfMemoryException的原因。

如果它是XPage上运行该进程的唯一内容,请将viewState属性设置为&#34; nostate&#34;。如果所有数据库都在这样做,您可以在Xsp属性中设置它。

或者,如果您需要在XPage中自行序列化和检索数据,请设置&#34;服务器页面持久性&#34;在Xsp属性的持久性选项卡上&#34;将页面保留在磁盘上#34;应该解决问题。然后什么都不会存储在内存中。加载页面后,它的数据将存储在磁盘上。