无法使用Postgres,JDBCTemplate,Spring保存大文件

时间:2014-06-06 06:25:42

标签: java spring postgresql

在我们公司,我们使用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 Heap Space异常。

1 个答案:

答案 0 :(得分:0)

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

可能的解决方案是设置-Xmx2048m-Xms256m JVM参数以增加堆大小。像:

java -Xmx1024m -Xms256m REST_OF_ARGUMENTS

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

-Xmx2048k
-Xmx1024m
-Xmx2g