有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如果一个应用程序由于其他非故意的异常而崩溃,java SQL数据库会关闭吗?

在阅读了数据库SQL最佳实践之后,我将两个try-catch提取到两个不同的方法中。我能想到的唯一一件事是,如果在执行getReadableDatabase()之后出现了外部未受影响的异常,那么就会造成数据库泄漏。所以我的问题是,如果一个应用程序崩溃并重新启动,该应用程序会自我清理吗?例如,是否帮助我关闭此数据库会话?正如你所见,我并不完全理解应用程序崩溃/重启后会发生什么

  try {
            SQLiteDatabase database = helper.getReadableDatabase();
            doALongDatabaseTask(database);
            database.close();
        } catch (SQLException e){
            Log.w(Util.TAG, "getButtonPairsForSending db cannot be opened " + e);
        }

public void doALongDatabaseTask(SQLiteDatabase database){
 try
 {
   // Do long database query task
   } catch(Exception e) {

    }

}

共 (1) 个答案

  1. # 1 楼答案

    在您的示例方法doALongDatabaseTask(SQLiteDatabase database)中,异常是被处理的,它什么也不做,所以在这种情况下,您的数据库将调用close()

    但是,如果您的方法被定义为抛出异常

    public void doALongDatabaseTask(SQLiteDatabase database) throws Exception{...}
    

    然后,关闭调用将被跳过,因为它进入了示例第一部分中的catch块

    假设您使用的sdk版本足够高:如果您查看^{}的文档,您可以看到它实现了接口AutoCloseable。 这意味着您可以使用如下所示的资源进行尝试

    try(SQLiteDatabase database = helper.getReadableDatabase()){
        doALongDatabaseTask(database);
    } catch (Exception e) {
        e.printstacktrace();
    }
    

    这相当于在finally块中调用database.close()(无论如何都应该这样做),但可读性更高。在大多数情况下,当你的应用程序崩溃时,这应该会清理连接,重新启动后可以获得新的连接