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 回答