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. ステートメントと結果セットを正しく閉じていません。特に接続プールを使用している場合、接続を閉じることは必ずしも物理接続を閉じることを意味するとは限らないため、これが必要です。

  3. 内側の try ブロックは不要です。catch ステートメントの下で、finally ブロックをプッシュすることもできます。

接続、ステートメント、結果セットを自分で処理する代わりに、Spring JdbcTemplate のような軽量のフレームワークがあり、リソースを適切に閉じることができます。

また、JDK 7 を使用している場合は、クローズ可能なすべてのリソースに対して try-with-resources コンストラクトを使用する必要があります。接続、ステートメント、および結果セット。

于 2012-10-21T09:18:46.663 に答える
2

結果セットを処理せずに接続を閉じるため、正しくありません。このメソッドの呼び出し元は、役に立たないオブジェクトを受け取ります。

これを修正する方法は、すべてのデータをインスタンス化するオブジェクトに抽出しResultSet、メカニズム固有のオブジェクトである を返さないことです。そのライフサイクルは、ステートメントのライフサイクルと接続にバインドされています。

例外を処理する方法も疑わしいです。実際には、グローバル例外バリアまで、例外を呼び出し元に伝播させ、呼び出しスタックをさらに上に伝播させる必要があります。あなたがそれを行う方法は、戻りの場合に呼び出し元に特別なコードを持たせることを強制しますnull.

于 2012-10-21T09:18:35.580 に答える