【发布时间】: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