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