【问题标题】:Working with large XML files in Postgresql在 Postgresql 中处理大型 XML 文件
【发布时间】:2016-03-01 20:15:59
【问题描述】:

我正在使用 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 文件?

【问题讨论】:

  • 您需要利用 PostgreSQL XML 类型还是只是存储它?如果您不需要使用 XML 功能,则可以将其存储为文本类型。
  • 理想情况下,我想利用 XML 类型,这样我们就可以直接在列上运行 xpath 搜索以及随之而来的验证。我知道我们可以使用 clob / text 列作为最后的手段,但仍然不明白 Postgresql 9.0.4 和 9.4 之间发生了什么变化
  • 我想了这么多——我会查看服务器日志,看看那里是否有什么有趣的东西,也许,将你的 JDBC 驱动程序更新到最新的。否则,这听起来像是 9.4 中的 PostgreSQL 错误,您可能需要报告。 9.5 是当前的生产版本,但这可能是一个很好的工作,只是为了尝试它。
  • 看起来这是一个与您的 Postgres 二进制文件链接的 limit in libxml2
  • 刚刚检查过,PosgreSQL 9.5 也是同样的情况。所以我假设没有办法设置 libxml2 需要直接通过 PostgreSQL 绕过这个限制的 XML_PARSE_HUGE 选项?然后我唯一的其他选择是将 PostgreSQL 附带的 libxml2 库替换为关闭此限制的路径版本。除非我在这里遗漏了什么,否则 PostgreSQL 团队似乎非常短视

标签: java xml postgresql jdbc libxml2


【解决方案1】:

显然,这个“错误”源于用于处理 XML 解析和处理的底层 xml 库(例如 libxml/libxml2),并且可以在使用该库的多种语言中找到这种错误 - 例如。蟒蛇,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>')

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    相关资源
    最近更新 更多