1

这个结构正确吗?还是有任何错误/坏习惯?

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

2 回答 2

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

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

  3. 内部的 try 块是不必要的,您也可以在 catch 语句下将 finally 块推出。

不是自己处理连接、语句、结果集,而是像 Spring JdbcTemplate 这样的轻量级框架可以正确关闭资源。

Also, if you are using JDK 7, then you should use the try-with-resources construct for all those closeable resources viz. connection, statement and resultset.

于 2012-10-21T09:18:46.663 回答
2

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

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

处理异常的方式也令人怀疑:实际上应该让异常传播到调用者并进一步向上调用堆栈,直到全局异常屏障。你这样做的方式会强制调用者在null返回的情况下使用特殊代码。

于 2012-10-21T09:18:35.580 回答