在Postgresql中使用大型XML文件

时间:2016-03-01 20:16:00

标签: java xml postgresql jdbc libxml2

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

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文件?

1 个答案:

答案 0 :(得分:0)

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