Java 更新字符串长度超过10M的XML字段时,XML文档无效

Java 更新字符串长度超过10M的XML字段时,XML文档无效,java,xml,postgresql,jdbc,Java,Xml,Postgresql,Jdbc,我试图用一个大字符串更新PostgreSQL表中的xml类型字段。如果数据长度>10M个字符,我将从服务器返回一个错误。我们使用UPDATE而不是INSERT,因为我们很难只插入xml字段,所以我们移植了所有其他记录/字段,将xml保留到最后 以前有人见过这个吗?也许你知道一个遥远的地方?服务器配置是否错误 我们正在使用最新的JDBC驱动程序9.3-1102和服务器9.3.4 64位 这是我们正在使用的代码: org.postgresql.Driver.setLogLevel(org.p

我试图用一个大字符串更新PostgreSQL表中的xml类型字段。如果数据长度>10M个字符,我将从服务器返回一个错误。我们使用UPDATE而不是INSERT,因为我们很难只插入xml字段,所以我们移植了所有其他记录/字段,将xml保留到最后

以前有人见过这个吗?也许你知道一个遥远的地方?服务器配置是否错误

我们正在使用最新的JDBC驱动程序9.3-1102和服务器9.3.4 64位

这是我们正在使用的代码:

    org.postgresql.Driver.setLogLevel(org.postgresql.Driver.DEBUG);
    Connection connDB = SampleApp.getPostgresConnection(connInfo);

    FileInputStream fis = new FileInputStream(fileEntry);
    Scanner reader = new Scanner(fis);
    reader.useDelimiter("%&#");

    try {
      connDB.setAutoCommit(false);

      while (reader.hasNext()) {
        String id = reader.next();
        id = id.replaceAll("\n", "");
        String line = reader.next();
        line = line.replaceAll("\'", "\'\'");

        String updateQuery = "UPDATE OMF SET XML_FILE = XMLPARSE ( DOCUMENT  \'" + line + "\' ) WHERE ID = " + id;
        try {
          System.out.println("length: " +line.length() +" queryLen=" +updateQuery.length());

          PreparedStatement preStatement = conDB.prepareStatement(updateQuery);
          preStatement.execute();
          preStatement.clearParameters();
          preStatement.close();

          connDB.commit();
        }
        catch (SQLException e) {
          System.out.println("Error updating id#" +id);
          e.printStackTrace();
        }
      }
    } catch (NoSuchElementException e) {
      // this just means EOF
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
  catch (FileNotFoundException e) {
    System.out.println("FileNotFoundException with file " +fileEntry.getPath().toString());
    e.printStackTrace();
  }
这是错误消息:


10:42:26.805 1您可以发送一个示例作为psql脚本吗?它看起来像PostgreSQL或libxml2 bug。10MB是个奇怪的数字,可能和工作记忆有关,虽然我不这么认为。你可以试着增加工作量。请发送一个简化的测试用例作为psql脚本。例如,您可以尝试重新检查长字符串md5的有效性。是可能的,所以长字符串在其他地方被破坏,而这个bug只是第一个可见的影响。。。。10MB的文本…“其中ID=123456;”这会引发上面显示的相同错误。我成功地测试了以120MB存储xml。我在libxml2中发现了10MB的内部限制。。此问题可能取决于您的XML。你能增加记录消息的详细程度吗?它可以显示来自PostgreSQL源代码的错误源-log\u error\u verbosity极好的信息!听起来我可能想把10MB的限制作为一种安全特性,并找到另一种解决问题的方法。也许我可以将数据加载到XML文档中,然后使用XPath将其加载到数据库中。这是缓慢的,但可能更多的未来证明。谢谢你,帕维尔。