Это лучший способ освободить соединение 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;
}