gpt4 book ai didi

java - 通过 Spring JDBC 流式传输数据,长度未知

转载 作者:搜寻专家 更新时间:2023-11-01 01:48:38 26 4
gpt4 key购买 nike

我目前有一个应用程序通过使用 Spring JDBC [SqlLobValue] 将 byte[] 插入到我们的数据库中。问题是,这不是一种可扩展的数据接收方式,因为服务器在写入数据库之前会在内存中缓冲所有数据。我想从 HttpServletRequest Inputstream 流式传输数据,但是我可以找到的所有将 Inputstream 作为参数的类的构造函数也需要内容长度作为参数。我没有,也不会要求用户在将数据发布到我的应用程序时知道内容长度。有没有办法绕过这个限制?

我找不到关于如果我将内容长度传递给 -1 会发生什么的文档,但我猜它会抛出异常。我不确定为什么他们不能让流继续读取直到 read(...) 返回 -1,这是 InputStream 所需的行为。

最佳答案

我猜你指的是“InputStream”而不是“OutputStream”。我试过了,但我的 JDBC 驱动程序遇到了更大的问题,所以我不确定这是否真的有效。

InputStream inputStream = httpServletRequest.getInputStream();

int contentLength = -1; // fake, will be ignored anyway
SqlLobValue sqlLobValue = new SqlLobValue(
inputStream,
contentLength,
new DefaultLobHandler() {
public LobCreator getLobCreator() {
return new DefaultLobHandler.DefaultLobCreator() {
public void setBlobAsBinaryStream(PreparedStatement ps, int paramIndex, InputStream binaryStream, int contentLength) throws SQLException {
// The contentLength parameter should be the -1 we provided earlier.
// You now have direct access to the PreparedStatement.
// Simply avoid calling setBinaryStream(int, InputStream, int)
// in favor of setBinaryStream(int, InputStream).
ps.setBinaryStream(paramIndex, binaryStream);
}
};
}
}
);

jdbcTemplate.update(
"INSERT INTO foo (bar) VALUES (?)",
new Object[]{ sqlLobValue }
);

关于java - 通过 Spring JDBC 流式传输数据,长度未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/778173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com