【发布时间】:2021-02-23 02:25:15
【问题描述】:
public ResultSet executeQuery(String query) {
return session.call(query)
}
public List<Record> findRecords(String name) {
String query = prepareQuery(name);
return mapResultToRecord(executeQuery(query));
}
public List<Record> mapResultToRecord(ResultSet rs) {
try {
List<Record> list = new ArrayList<>();
while(rs.hasNext()) {
list.add(new Record(rs.next()));
}
} catch (Exception e) {
logger.warn("exception while iterating over the recall set", e);
} finally {
try {
rs.close();
} catch (Exception ex) {
logger.warn("exception while closing the result set", ex);
}
}
}
在上面的代码中,ResultSet 由executeQuery 打开,但由mapResultToRecord 关闭。这是关闭它的理想位置还是应该由findRecords 函数承担责任?
【问题讨论】:
-
这无论如何都行不通。要么您正在泄漏
Connection,要么您正在关闭它,这将关闭ResultSet,或者您正在尝试使用持久连接,这很容易失败:您应该使用本地Connection,本地PreparedStatement和本地的ResultSet,然后将它们全部关闭,并用连接池支持Connection。
标签: java autocloseable