gpt4 book ai didi

java - 尝试将 BLOB 作为 InputStream 读取,但出现连接关闭错误。 Spring3 getJdbcTemplate() 方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:23:01 26 4
gpt4 key购买 nike

我正在移动一个应用程序以使用 Spring3 框架,并且我有从 Oracle 数据库读取 BLOB 列的代码:

这个有效:

        String fileSqlStr =
"select file_id, file_content from cpm_file where file_id = 4";
PreparedStatement ps = conn.prepareStatement(fileSqlStr);
ResultSet rs = ps.executeQuery();
rs.next();
int fileId = rs.getInt("file_id");
InputStream fis = rs.getBinaryStream("file_content");
ExlBOMImporter ei = new ExlBOMImporter(fis);

但是当我尝试使用 JdbcTemplate bean 用 Spring 编写它时:

 InputStream is = getJdbcTemplate().query(getFileContentSql, new RowMapper<InputStream>() {

public InputStream mapRow(ResultSet rs, int rowNum) throws SQLException {
OracleLobHandler lobHandler = new OracleLobHandler();
return lobHandler.getBlobAsBinaryStream(rs, "file_content");
}
}, fileId).get(0);
ExlImporter importer = new ExlBOMImporter(is);
importer.process();

我收到一个 java.io.IOException: Closed Connection 异常。

我认为 Spring 必须在我开始处理它之前关闭 InputStream 的连接。你们有更好的写法吗?

编辑:异常更深入:

java.io.IOException: Closed Connection
at oracle.jdbc.driver.OracleBlobInputStream.needBytes(OracleBlobInputStream.java:204)
at oracle.jdbc.driver.OracleBufferedStream.readInternal(OracleBufferedStream.java:169)
at oracle.jdbc.driver.OracleBufferedStream.read(OracleBufferedStream.java:143)
at org.apache.poi.util.IOUtils.readFully(IOUtils.java:92)
at org.apache.poi.util.IOUtils.readFully(IOUtils.java:77)
at oracle.jdbc.driver.OracleBlobInputStream.needBytes(OracleBlobInputStream.java:204)

最佳答案

是的,Spring 会在离开query 方法时清理连接。

最简单的解决方案是在 RowMapper 中执行处理,例如

getJdbcTemplate().query(getFileContentSql, new RowMapper<Void>() {
public void mapRow(ResultSet rs, int rowNum) throws SQLException {
OracleLobHandler lobHandler = new OracleLobHandler();
InputStream inputStream = lobHandler.getBlobAsBinaryStream(rs, "file_content");
ExlImporter importer = new ExlBOMImporter(inputStream);
importer.process();
}
}, fileId);

如果您只想处理第一行,请使用 ResultSetExtractor 而不是 RowMapper

关于java - 尝试将 BLOB 作为 InputStream 读取,但出现连接关闭错误。 Spring3 getJdbcTemplate() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9839471/

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