1

JavaでSQLIte接続を閉じるための良い方法が必要です。finally他のユーザーからのいくつかの提案の後、閉じる操作が常に実行されるように、コードにブロックを追加することにしました。

public static boolean executeQuery(String query)
{

    Connection conn = null;
    Statement stmt = null;

    try
    {
        Class.forName("org.sqlite.JDBC");
        conn = DriverManager.getConnection(Global.dbPath);
        stmt = conn.createStatement();
        stmt.execute(query);
        return true;   
    }
    catch(ClassNotFoundException e)
    {
        System.out.println(e);
        return false;
    }
    catch(SQLException e)
    {
        System.out.println(e);
        return false;
    }
    finally
    {
        try 
        { 
            stmt.close();
            conn.close();
            return true;
        } 
        catch (SQLException ex) 
        {
            System.out.println ("Errore closing connections");
            return false;
        }
    }
}

これが最善の解決策かどうかはわかりません。

読みやすくするためにこれを最適化するにはどうすればよいですか?

4

2 に答える 2

1

いくつかのコメント; 一言で言えば:

  • SQL例外をリフレクション例外から分離します。
  • SQL例外は回復可能ですか?そうでない場合は、アプリ固有のをスローしRuntimeExceptionます。
  • ユーティリティメソッド、自分のメソッド、またはサードパーティのメソッドで接続とステートメントのクローズ例外をまとめます。
  • 例外処理を短く変更しないでください。スタックトレースをダンプします。

これにより、次のようになります。

public static boolean executeQuery(String query) {
    try {
        Class.forName("org.sqlite.JDBC");
    } catch (ClassNotFoundException e) {
        throw new DbException("Could not find JDBC driver", e);
    }

    Connection conn = null;
    Statement stmt = null;

    try {
        conn = DriverManager.getConnection(Global.dbPath);
        stmt = conn.createStatement();
        stmt.execute(query);
        return true;
    } catch(SQLException e) {
        throw new DbException("Exception during statement execution", e);
    } finally {
        DbUtils.closeQuietly(conn);
        DbUtils.closeQuietly(stmt);
    }
}

(私はApache CommonsのDbUtilsを使用しcloseQuietlyていますが、nullをチェックします(あなたはしませんでした)。あなた自身のバージョンは、ここで行ったようにアプリ固有の例外をスローする可能性がありますDbException。これにより、DB関連のすべての例外が単一の例外クラス。これは、必要なものである場合とそうでない場合があります。

于 2012-09-06T13:09:09.850 に答える
0

コマンドが確実に実行されるようにしたい場合は、それを単独で try catch ブロックに入れる必要があります。

    try { 
        stmt.close();
    } 
    catch (Exception ex) {
    }

    try { 
        conn.close();
    } 
    catch (Exception ex) {
        System.out.println ("Error closing connections");
        return false;
    }
于 2012-09-06T11:21:20.203 に答える