gpt4 book ai didi

java - 我真的可以通过关闭连接读取 LOB 吗?

转载 作者:搜寻专家 更新时间:2023-11-01 03:50:46 25 4
gpt4 key购买 nike

我使用的是 wildfly-8.2.0.Final。此服务器上有连接池(Oracle)。看下面的代码:

public ArrayList<HashMap<String, Object>> fetchSome(String query)
throws OracleQueryProcessorException {
ArrayList<HashMap<String, Object>> result = new ArrayList<HashMap<String, Object>>();
try {
Context initCtx = new InitialContext();
DataSource ds = (DataSource) initCtx.lookup(driver);
try (Connection con = ds.getConnection();
PreparedStatement stmt = con.prepareStatement(query)) {
try (ResultSet rs = stmt.executeQuery()) {
ResultSetMetaData rsmd = rs.getMetaData();
rs.next();
HashMap<String, Object> row = new HashMap<String, Object>();
String name = rsmd.getColumnName(1);
Object value = rs.getObject(1);
if (value instanceof Blob) {
Blob bl = (Blob) value;
if (bl.length() > 0)
value = bl.getBinaryStream();
else
value = null;
}
row.put(name, value);
result.add(row);
}
} catch (SQLException e) {
throw new OracleQueryProcessorException();
}
} catch (NamingException e) {
throw new OracleQueryProcessorException();
}
return result;
}

这是这个函数的用法:

InputStream is = (InputStream) fetchSome("SELECT BLOB_FIELD FROM TEST WHERE ID = 1").get(0).get("BLOB_FIELD");
if (is != null) {
byte[] a = new byte[3];
is.read(a);
}

正在从此流中读取数据!!它是如何工作的?连接已关闭(因为使用 try-with-resources 子句)。从此流中读取不需要来自池的连接(所有池的连接都可用)。

最佳答案

fetchSome() 打开一个 Connection,发送查询,然后将数据读回生成的 ArrayList。然后 fetchSome 关闭 Connection 并返回 ArrayList。然后,您感兴趣的代码会从返回的 ArrayList 中读取,而不是像您正确注意到的那样,从关闭的 Connection 中读取。

当你的方法返回时,所有的数据库通信都已经完成,所有的数据都被复制到返回的列表中,然后可以根据需要从中读取它,而不需要 再次连接

关于java - 我真的可以通过关闭连接读取 LOB 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29272529/

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