【发布时间】: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