【问题标题】:Can't save large files with Postgres, JDBCTemplate, Spring无法使用 Postgres、JDBCTemplate、Spring 保存大文件
【发布时间】:2014-06-06 06:25:41
【问题描述】:

在我们公司,我们使用 Spring Core (4.0.4)、JDBCTemplate 和 Postgres 9.3。

当我尝试this example:

我在处理大文件 (> 200MB) 时遇到了一些问题。 我为我的场景调整了这个例子:

public void addToDB(final long documentId, final File file) throws IOException {
    String sql = "insert into filetest (id, content) values (?,?)";
    final InputStream blobIs = new FileInputStream(file);
    DefaultLobHandler defaultLobHandler = new DefaultLobHandler();
    jdbcTemplate
            .execute(sql, new AbstractLobCreatingPreparedStatementCallback(defaultLobHandler) {

                @Override
                protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException {
                    ps.setLong(1, documentId);
                    lobCreator
                            .setBlobAsBinaryStream(ps, 2, blobIs, (int) file
                                    .length());
                }
            });
    blobIs.close();
}

在 Postgres 上我创建了表格:

 CREATE TABLE filetest
 (
      id bigint,
      content bytea
 )
 WITH (
  OIDS=FALSE
  );
 ALTER TABLE filetest
 OWNER TO postgres;
 ALTER TABLE filetest ALTER COLUMN content SET STORAGE EXTERNAL;

我的测试使用上述方法调用存储库。 对于小文件,代码有效(使用 pgAdmin 客户端,我可以连接并看到两条记录)。

当我尝试加载大文件(超过 200 MB)时,我可以保存文件(实现没有给我错误)。但是,当我尝试从 pgAdmin 读取时,它会中止操作。只有当我选择 id 记录时,我才能看到它(只有内容记录中止搜索)。我认为这可能会发生为什么记录已损坏(我该如何检查?)或为什么 GUI-Client 无法加载记录(我从控制台尝试过,但我也有奇怪的行为)

现在的问题是:

  • Postgres有什么参数可以限制大小吗? (bytea 可以处理 1GB)

  • 是否可以检查数据是否已写入数据库?

因为当我尝试(以编程方式)从记录中读取时,我得到一个 Java 堆空间异常。

【问题讨论】:

  • 你得到任何错误???
  • 比较文件大小和数据库文件大小?您必须阅读该字段并计算其大小。
  • 限制返回结果的大小不是Postgres(服务器)的责任,客户端需要限制大小。如果您询问是否可以确保在 bytea 列中存储的字节数不超过 x,请使用检查约束
  • 无论如何我都不建议在bytea 字段中存储超过几百MB 的数据。整个东西需要在 RAM 中放置几次,这根本不是很有效。限制为 1GB,因此您在设计时已经非常接近它了。考虑pg_largeobject 或使用文件系统。
  • 最后解决方案是继续 pg_largeobject (txs Craig Ringer) 。 user3145373:没有显示错误信息(只有 java 堆空间异常)

标签: java spring postgresql


【解决方案1】:

因为当我尝试(以编程方式)从记录中读取时,我得到了 Java 堆空间异常。

可能的解决方案是设置-Xmx2048m-Xms256mJVM参数来增加堆大小。喜欢:

java -Xmx1024m -Xms256m REST_OF_ARGUMENTS

标志也可以指定多种大小,如KB、MB等。

-Xmx2048k
-Xmx1024m
-Xmx2g

【讨论】:

  • 谢谢你:这对错误没有影响。 (但现在问题已经解决了)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 2021-09-07
  • 2017-12-18
  • 1970-01-01
相关资源
最近更新 更多