Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是在Java中释放SQLite连接的最佳方式吗?_Java_Sqlite_Sqlexception_Try Catch Finally - Fatal编程技术网

这是在Java中释放SQLite连接的最佳方式吗?

这是在Java中释放SQLite连接的最佳方式吗?,java,sqlite,sqlexception,try-catch-finally,Java,Sqlite,Sqlexception,Try Catch Finally,我需要一种在Java中关闭SQLIte连接的好方法。在其他用户提出一些建议后,我决定在代码中添加一个finally块,以确保始终执行关闭操作 public static boolean executeQuery(String query) { Connection conn = null; Statement stmt = null; try { Class.forName("org.sqlite.JDBC"); conn =

我需要一种在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;
        }
    }
}
我不确定这是不是最好的解决方案


如何优化该命令的可读性?

如果要确保执行命令,必须将其单独放入try-catch块中:

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

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

如果要确保执行命令,必须将其单独放入try-catch块中:

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

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

一些评论;简而言之:

  • 将SQL异常与反射异常分开
  • SQL异常是否可恢复?如果不是,则抛出特定于应用程序的运行时异常
  • 将connection和statement close异常包装到实用程序方法(您的或第三方的)中
  • 不要短时间更改异常处理;转储堆栈跟踪
这导致以下情况:

publicstaticbooleanexecuteQuery(字符串查询){
试一试{
Class.forName(“org.sqlite.JDBC”);
}catch(classnotfounde异常){
抛出新的DbException(“找不到JDBC驱动程序”,e);
}
连接conn=null;
语句stmt=null;
试一试{
conn=DriverManager.getConnection(Global.dbPath);
stmt=conn.createStatement();
执行(查询);
返回true;
}捕获(SQLE异常){
抛出新的DbException(“语句执行期间异常”,e);
}最后{
DbUtils.安静地关闭(康涅狄格州);
DbUtils.closequisity(stmt);
}
}

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

一些注释;简而言之:

  • 将SQL异常与反射异常分开
  • SQL异常是否可恢复?如果不可恢复,则抛出特定于应用程序的
    RuntimeException
  • 将connection和statement close异常包装到实用程序方法(您的或第三方的)中
  • 不要短时间更改异常处理;转储堆栈跟踪
这导致以下情况:

publicstaticbooleanexecuteQuery(字符串查询){
试一试{
Class.forName(“org.sqlite.JDBC”);
}catch(classnotfounde异常){
抛出新的DbException(“找不到JDBC驱动程序”,e);
}
连接conn=null;
语句stmt=null;
试一试{
conn=DriverManager.getConnection(Global.dbPath);
stmt=conn.createStatement();
执行(查询);
返回true;
}捕获(SQLE异常){
抛出新的DbException(“语句执行期间异常”,e);
}最后{
DbUtils.安静地关闭(康涅狄格州);
DbUtils.closequisity(stmt);
}
}

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

好的。谢谢。因此,在我的代码中,最好的方法是使用您在我的finally block中发布的代码?谢谢!我的答案是:如果要执行all,请不要在try-catch块中放置多个命令。因为在出现异常的情况下,不会执行所有命令。好的。谢谢。所以在我的代码中,最好的方法是使用您在我的finally块中发布的代码?谢谢!我的回答的要点是:不要在try-catch块中放置多个命令如果要执行all,请锁定。因为在出现异常的情况下,不会执行所有命令。非常有用。您是否希望raccomand使用Apache Commons的DbUtils?或者只是创建自己的类来执行此操作?谢谢!另一个问题。我使用了您的代码,但编译器给了我一个“缺少的返回语句”异常。可能我需要在所有其他块之外的方法末尾放置一个return语句?谢谢!@Luca你不需要额外的返回,所有路径都会返回我们的抛出异常。我认为你是否编写自己的异常并不重要,但是如果你想让closes抛出你的异常,你需要编写自己的。Reall很有帮助。你是使用raccomand来使用Apache Commons的DbUtils吗?还是简单地创建我自己的类来实现?谢谢!还有一个问题。我使用了你的代码,但编译器给了我一个“缺少的返回语句”异常。可能我需要在所有其他块之外的方法末尾放置一个return语句?谢谢!@Luca你不需要额外的返回,所有路径都会返回我们的抛出异常。我认为你是否编写自己的异常并不重要,但如果你想让closes抛出你的异常,你需要编写自己的异常。