Это лучший способ освободить соединение SQLite в Java?

Мне нужен хороший способ закрыть соединения SQLIte в Java. После нескольких предложений других пользователей я решил добавить в свой код 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;
        }
    }
}

Я не уверен, что это лучшее решение.

Как я могу оптимизировать это для удобства чтения?

2 ответа

Решение

Несколько комментариев; ореховая скорлупа:

  • Отделите исключения 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, он проверяет на ноль (ваш не сделал). Ваша собственная версия может выдать исключение для конкретного приложения, как я делаю здесь с DbException, Это объединяет все ваши исключения, связанные с БД, в один класс исключений, который может или не может быть тем, что вам нужно.

Если вы хотите убедиться, что команда выполнена, вы должны поместить ее отдельно в блок try catch:

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

    try { 
        conn.close();
    } 
    catch (Exception ex) {
        System.out.println ("Error closing connections");
        return false;
    }
Другие вопросы по тегам