回报不正确?

时间:2012-10-21 09:14:23

标签: java sql jdbc

这种结构是否正确?或者有任何错误/坏习惯吗?

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;
        }

2 个答案:

答案 0 :(得分:3)

  1. 关闭基础语句或连接或两者后,无法处理结果集。如果您打算稍后处理它,您应该查看从结果集构建的CachedRowSet,并在关闭语句/连接之后的某个时间点处理结果集。

  2. 您没有正确关闭语句和结果集。这需要关闭连接并不总是意味着关闭物理连接,尤其是在使用连接池时。

  3. 内部尝试块是不必要的,您也可以在catch语句下推送最终阻止。

  4. 除了自己处理连接,语句,结果集之外,还有像Spring JdbcTemplate这样的轻量级框架,可以正常关闭资源。

    此外,如果您使用的是JDK 7,那么您应该对所有可关闭的资源使用try-with-resources构造。连接,语句和结果集。

答案 1 :(得分:2)

这是不正确的,因为您在不处理结果集的情况下关闭连接。此方法的调用者将收到一个无用的对象。

解决此问题的方法是将所有数据提取到您实例化的对象中,并且永远不会返回ResultSet,这是一个特定于机制的对象,其生命周期绑定到语句和连接的生命周期。

处理异常的方式也是可疑的:在实践中,应该让异常传播到调用者并进一步向上调用堆栈,直到全局异常障碍。这样做会强制调用者在null返回的情况下拥有特殊代码。