在 Postgresql 中处理大型 XML 文件

Working with large XML files in Postgresql

我正在使用 Java JDBC 将一个相当大的 XML 文件(大约 32MB)插入到 Postgres 中的 "xml" 类型列中,使用这种特定的方法/方法:

public void setDataXML(PreparedStatement ps, Connection conn, int index, byte[] bytes) throws SQLException {
    SQLXML sqlxml = conn.createSQLXML();
    OutputStream os = sqlxml.setBinaryStream();
    try {
        os.write(bytes);
    } catch (IOException e) {
        throw new SQLException(e);
    }
    ps.setSQLXML(index, sqlxml);
}

我目前正在使用 postgresql-9.4.1208.jar JDBC 驱动程序进行此操作。以前这在 运行 针对 Postgres 9.0.4 数据库时工作得很好。我已经升级到 Postgres 9.4 数据库,现在这个操作失败了:

    PreparedStatementCallback; SQL []; ERROR: invalid XML content
Detail: line 418061: internal error: Huge input lookup
nested exception is org.postgresql.util.PSQLException: ERROR: invalid XML content

我已经在 Windows 和 Amazon Linux 实例上进行了测试,结果是一样的。我知道它与 XML 文件的大小有关,因为大大减小 XML 文件的绝对大小允许它根据需要插入。

我可以在驱动程序/数据库上使用什么设置,或者如何进行配置以允许我使用 Postgres 9.4 插入一个大 XML 文件?

显然这个'error'源于用于处理XML解析和处理(例如libxml/libxml2)的底层xml库,并且可以找到这种错误对于使用该库的多种语言 - 例如Python, R, ... (Postgres)

代码没有显示 Java 如何构建准备好的语句,但是,在 Postgres (PostgresDoc) 中有两种解析 XML 的方法:

XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chpt>...</chpt></book>')
XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')

第二个是默认值,可能需要比第二个更少的数据(在使用 :: 语法进行转换时也使用 '<a>1</a>'::xml )。

  • 选项 1:显式构造您的语句并显式使用 XMLPARSE (DOCUMENT ...)
  • 选项 2:将 DOCUMENT 设置为默认值
    • SET XML OPTION DOCUMENT;
    • SET xmloption TO DOCUMENT;