【问题标题】:Copy documentum content with apache IOUtils.copy() and setContent()使用 apache IOUtils.copy() 和 setContent() 复制文档内容
【发布时间】:2010-12-14 23:29:18
【问题描述】:

我想将内容从存储在一个文档库中的一个对象复制到存储在另一个文档库中的另一个对象。我不想创建文件,因为我有超过 300 k 的文件要复制。以下是我的部分代码:

ByteArrayOutputStream baos = new ByteArrayOutputStream();

IOUtils.copy(source.getContent(), baos);

[...]
targetObj.setContent(baos); // Documentum DFC
targetObj.save(); // Documentum DFC

如果我不调整 JVM,IOUtils.copy(source.getContent(), baos); 将提供java.lang.OutOfMemoryError: Java heap space

如果我通过设置 Xmx 最大值来调整 JVM,之前的指令是可以的,但是 java.lang.OutOfMemoryError: Java heap spacetargetObj.setContent(baos); 发生。

只有 8332175 字节的大内容... (7.94 MB)

知道有什么问题吗?从 ByteArrayInputStream 复制到 ByteArrayOutputStream 的更好方法?还有什么?


一些 Documentum API

获取内容

公共 ByteArrayInputStream getContent() 抛出 DfException

将此对象的内容从 Documentum 服务器复制到 ByteArrayInputStream >对象中。

以下代码示例演示如何将对象内容从 >Documentum 服务器复制到内存中:

    IDfSysObject sysObj = (IDfSysObject)session.getObject(new DfId("0900d5bb8001f900"));
    ByteArrayInputStream bais = sysObj.getContent();
    if (bais.available() > 0)
    {
         // Data successfully fetched from the server...
    }

返回: 包含对象内容的 ByteArrayInputStream 对象。 抛出: DfException - 如果发生服务器错误。

设置内容

public boolean setContent(ByteArrayOutputStream 内容) 抛出 DfException

为对象设置新内容。当您想要设置驻留在工作内存中的数据时,请使用此方法。

以下代码示例演示如何将驻留在内存中的内容设置为新文档:

    IDfSysObject sysObj = (IDfSysObject)sess.newObject("dm_document");
    sysObj.setObjectName("testDoc");
    sysObj.setContentType("crtext");
    byte b[] = {35,36,37,38,39};
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    out.write(b, 0, 5);
    sysObj.setContent(out);
    sysObj.save();

参数: content - 作为 ByteArrayOutputStream 的内容。 抛出: DfException - 如果发生服务器错误。

【问题讨论】:

  • 你是从 IOUtils 还是从 setContent() 获得 OutOfMemory 的?
  • 你在哪里发生异常。并请添加到 documentum api 的链接
  • "当您想要设置驻留在工作内存中的数据时,请使用此方法。"这听起来像是日期不在工作记忆中的另一种情况......
  • @jitter:错误和严重的错误! Documentum setContent 指令发生异常......根本不是 IOUtils.copy()。很抱歉这个错误。
  • @Thilo :是的,还有另一种方法可以设置存储在 FS 中的文件的内容……但我会阻止这种情况,以保持客户的轻松。

标签: java copy apache-commons documentum


【解决方案1】:

只要您使用ByteArrayOutputStream,数据就必须适合内存。

我对 Documentum 一无所知,但可能有 targetObj.setContent(File)setContent(InputStream),这样您就可以避免将整个块读入 byte[]

(虽然8MB并不是那么大,也许你可以调整Java堆空间。它还可以帮助预先调整BAOS使用的缓冲区大小,你可以将初始大小传递给它的构造函数)

更新:你确定 setContent 需要一个 ByteArray Output 流吗?通常,setter 会从 InputStream 中读取数据。

【讨论】:

  • 除了使用 Documentum 5.3 设置内容(BAOS)之外,没有其他已知方法。当然我的第一个动作是将 Xmx 增加到 1024m,但仍然是 java 堆空间。这不是一个解决方案,因为我不知道数据库的 maxFileSize。 setContent(BAOS) 和 getContent() 返回一个 BAIS,这就是我使用 IOUtils.copy();
  • 如果可能,在复制操作后立即消除所有指向源及其 BAIS 的链接,以便对其数据副本进行垃圾收集。
  • 我就是这么想的,我会尽快把我没用的资源清空。
  • 我根据您的建议修补了我的代码。设置 BAOS 的大小对于内存管理和执行速度非常有用。尽快设置为空,我们不再需要该对象似乎对内存管理很有用。增加 Xms 和 Xmx jvm 内存大小很重要。感谢你们所有人和蒂洛!
  • @Thilo 更新:您确定 setContent 采用 ByteArray 输出流吗?通常,setter 会从 InputStream 中读取。 Documentum 很奇怪...
【解决方案2】:

如果您需要将其临时存储在内存中,请使用以下方法增加 JVM 最大内存大小:

java -Xmx256m

将最大内存分配增加到 256Mb(默认为 64Mb)。详情请见here

【讨论】:

  • 遗憾的是我修复了 -Xms1024m 和 -Xmx1024m... 仍然是 OutOfMemoryError
【解决方案3】:

我在处理大文件时遇到过这样的问题,除了尝试增加堆大小之外,它真的没有任何魔力。我知道您说过您不想在运行代码的客户端上本地创建文件,但您可能想看看使用操作来执行此操作。本质上,您只需运行导出操作以从源存储库中获取文件,然后使用导入操作在目标中创建它。作为导入操作的一部分,您可以设置一个标志以在操作完成时删除源文件。

   IDfClientEx clientx = new DfClientEx();
   IDfExportOperation exOp = clientx.getExportOperation();
   IDfSysObject exportObj = getObjectToExport();
   IDfExportNode = (IDfExportNode) exOp.add(exportObj);
   exOp.execute();
   String path = exOp.getFilePath();

   IDfImportOperation impOper = clientx.getImportOperation();
   IDfFile dfFile = new DfFile(path);
   IDfImportNode impNode = (IDfImportNode) impOper.add(dfFile);
   impNode.setDocbaseObjectType("dm_document");
   impNode.setDestinationFolderId(importFolderId);
   impNode.setNewObjectName("testDoc");
   impNode.setFormat("crtext");
   impOper.setKeepLocalFile(false);
   impOper.execute();

【讨论】:

  • 你是对的,没有神奇的解决方案:我将堆大小增加到 1640m(我的系统最大值),这似乎足以满足我的需要(最大文件大小:8MB)。我试图创建一个本地临时文件,它也很好。所以没有神奇的解决方案! ^^
猜你喜欢
  • 2022-06-16
  • 1970-01-01
  • 2010-10-02
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
相关资源
最近更新 更多