【发布时间】:2021-02-15 10:15:42
【问题描述】:
我是 Java 新手。我正在尝试创建一个类,其中包含一些用于 Java 1.6 中 SQL 操作的实用方法,以用于一般用途。
我写了一个selectMethod 来获取数据库上SELECT 的结果。
问题:如果我的selectMethod 方法返回ResultSet 类型,那么当我调用该方法时,其相关资源(ResultSet,Statement)将不可避免地保持打开状态:我不能从另一种方法关闭它们,因为它们已被创建到 selectMethod... 另一方面我不能在 selectMethod 中关闭它们,否则后者不会返回任何东西。
所以我的观点是: ==> 如何关闭资源?
我无法使用try-with-resource,因为我使用的是早期版本的 Java。
在类似的问题中,我还没有找到解决这个问题的“一般方法”。
解决方案:目前我知道的仅有两种方法:
A) 避免创建返回ResultSet 类型的selectMethod,而只创建一个在内部执行查询的方法,以及对查询结果的其他操作。然后将所有资源关闭到方法中。
例子:
public String selectMethod(String query, Connection conn) {
Statement stmt = null;
ResultSet rset = null;
String myOutput = "";
try {
stmt = conn.PreparedStatement(query);
rset = st.executeQuery();
myOutput = rs.getString(2); // the "particular task" I perform on the data retrieved
} catch (SQLException e) {
System.out.println(e);
} finally {
rset.close();
stmt.close();
}
return myOutput;
}
...
...
// method call:
String myQuery = "SELECT colA FROM table_name WHERE table_id = 192837465";
String theDataINeeded = selectMethod(myQuery, myConn);
myConn.close();
A) 的缺点:我想要一个通用的 SQL 类,不限于特定任务...
B) 到selectMethod,将ResultSet 数据复制到CachedRowSet 并返回CachedRowSet。
例子:
public CachedRowSet selectMethod(String query, Connection conn) {
Statement stmt = null;
ResultSet rset = null;
CachedRowSetImpl crset = null;
try {
stmt = conn.PreparedStatement(query);
rset = st.executeQuery();
crset = new CachedRowSetImpl();
crset.populate(rset);
} catch (SQLException e) {
System.out.println(e);
} finally {
rset.close();
stmt.close();
}
return crset;
}
...
...
// method call:
String myQuery = "SELECT colA FROM table_name WHERE table_id = 192837465";
CachedRowSetImpl theDataINeeded = new CachedRowSetImpl();
theDataINeeded = selectMethod(myQuery, myConn);
myConn.close();
B) 的缺点:我担心在选择多行时会耗尽内存。我无法使用LIMIT... OFFSET... 进行分页查询,因为我的数据库版本低于Oracle 12g,并且我不想进行查询操作以插入row_number() between ... and ...。我希望我的实用程序可以处理任何类型的查询。
有人知道其他解决方案吗?
提前致谢。
【问题讨论】:
-
考虑阅读诸如 Hibernate 之类的 ORM 工具,它可以让您通过使用 objects 与数据库进行交互,而不是像您一样使用笨重的语句在上面做。
-
很抱歉,我的笨拙的陈述让您烦恼,因为我说过我是 Java 新手。谢谢你的建议。
-
我的经验法则是“不要关闭不属于你的东西”。因此,在您的方法中,语句和结果集是“您的”,但连接不是 - 它是作为参数提供给您的,因此从技术上讲,关闭它不是您的方法的责任 - 这应该由创建最初连接。
-
谢谢 :) 我编辑了删除连接关闭的问题。
标签: java resultset cachedrowset