这是用Java发布SQLite连接的最佳方式吗



我需要一种在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;
        }
    }
}

我不确定这是否是最好的解决方案。

如何优化可读性?

一些评论;坚果壳:

  • 将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);
    }
}

(我使用ApacheCommons的DbUtils作为closeQuietly,它检查null(您的没有)。您自己的版本可能会抛出特定于应用程序的异常,就像我在DbException中所做的那样。这将所有与DB相关的异常打包到一个单独的异常类中,这可能是您需要的,也可能不是您需要的。

如果你想确保一个命令被执行,你必须把它单独放在一个try-catch块中:

    try { 
        stmt.close();
    } 
    catch (Exception ex) {
    }
    try { 
        conn.close();
    } 
    catch (Exception ex) {
        System.out.println ("Error closing connections");
        return false;
    }

相关内容

  • 没有找到相关文章

最新更新