这是在Java中释放SQLite连接的最佳方式吗?
我需要一种在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 =
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抛出你的异常,你需要编写自己的异常。