Exception时的JDBC连接管理器和Connection对象

时间:2013-06-30 16:22:18

标签: java jdbc exception-handling

我有一个jdbc postgresql应用程序,我编写了“标准”连接管理器。对于每个成功的事务,我关闭语句对象和连接对象。 如果SQLExceptionClassNotFoundException中的一个出现,语句和连接对象会发生什么?在catch块中我应该关闭这两个对象吗?类似的东西:

Connection conn = null;
PreparedStatement pstm = null;
try {
    conn = ConnectionManager.getConnection();
    pstm = conn.CreateStatement(statement);
    //set statement
    }catch (SqlException ex) {
        if(conn != null) {
            pstm.close();
            conn.close();
        }
        throw new MyException("error");
    }catch (ClassNotFoundException ex) {
        if(conn != null) {
            pstm.close();
            conn.close();
        }
        throw new MyException("error");
     }
}

3 个答案:

答案 0 :(得分:4)

  

在catch块中我应该关闭这两个对象吗?

即可。切勿关闭挡块中的任何物体。要关闭任何资源,请使用finally{}阻止。

答案 1 :(得分:2)

您可以将您的连接和语句关闭语句放在finally块中,以确保无论是否存在异常都将其关闭。当try块退出时,最终总是很有用。你可以尝试这样的事情:

Connection conn = null;
PreparedStatement pstm = null;
try {
    conn = ConnectionManager.getConnection();
    pstm = conn.CreateStatement(statement);
    //set statement
    }catch (SqlException ex) {
        throw new MyException("error");
    }catch (ClassNotFoundException ex) {
   
        throw new MyException("error");
     }finally {
        if(conn != null) {
         try {
            pstm.close();
            conn.close();
         } catch (SQLException e) {  
           // throw or log the exception;
         }

        }
    }
}

答案 2 :(得分:2)

在您的代码资源中,尝试在多个位置关闭资源,导致代码重复。

所以你应该使用finally块来关闭像bellow这样的资源:

 finally {
    if (pstm != null) {
        try {
           pstm.close();
        } catch (SQLException e) { /* ignored */}
    }

    if (conn != null) {
       try {
          conn.close();
       } catch (SQLException e) { /* ignored */}
    }
 }

因为无论发生什么事情,都会在返回方法调用之前执行finally块。