我正在使用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文件?
答案 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
)。
XMLPARSE (DOCUMENT ...)
DOCUMENT
设为默认值
SET XML OPTION DOCUMENT;
或SET xmloption TO DOCUMENT;