这种结构是否正确?或者有任何错误/坏习惯吗?
public static ResultSet getRecord(String id)
{
Connection conn = DataBase.Connect();
try
{
try
{
Statement stm = conn.createStatement();
ResultSet data = stm.executeQuery("SELECT * FROM " + GlobalFields.Records + " WHERE id = '" + id + "';");
return data;
}
finally
{
conn.close();
}
}
catch(SQLException e)
{
e.printStackTrace();
}
return null;
}
答案 0 :(得分:3)
关闭基础语句或连接或两者后,无法处理结果集。如果您打算稍后处理它,您应该查看从结果集构建的CachedRowSet,并在关闭语句/连接之后的某个时间点处理结果集。
您没有正确关闭语句和结果集。这需要关闭连接并不总是意味着关闭物理连接,尤其是在使用连接池时。
内部尝试块是不必要的,您也可以在catch语句下推送最终阻止。
除了自己处理连接,语句,结果集之外,还有像Spring JdbcTemplate这样的轻量级框架,可以正常关闭资源。
此外,如果您使用的是JDK 7,那么您应该对所有可关闭的资源使用try-with-resources构造。连接,语句和结果集。
答案 1 :(得分:2)
这是不正确的,因为您在不处理结果集的情况下关闭连接。此方法的调用者将收到一个无用的对象。
解决此问题的方法是将所有数据提取到您实例化的对象中,并且永远不会返回ResultSet
,这是一个特定于机制的对象,其生命周期绑定到语句和连接的生命周期。
处理异常的方式也是可疑的:在实践中,应该让异常传播到调用者并进一步向上调用堆栈,直到全局异常障碍。这样做会强制调用者在null
返回的情况下拥有特殊代码。