Java 用作实例变量的结果集

Java 用作实例变量的结果集,java,prepared-statement,resultset,connector,Java,Prepared Statement,Resultset,Connector,在程序中,连接器、preparedstatement和resultset用作实例变量,每次在单独的方法中使用后都会关闭,如下所示,然后通过创建新的连接器对象重新使用,将其分配给con,以便后续调用。这样做安全吗?还是在方法中本地创建单独的连接器对象并在finally块中关闭它更好 private void closeObjects() throws Exception{ if(rs!=null){ rs.close(); rs=null; } if(preparedstmt!=null

在程序中,连接器、preparedstatement和resultset用作实例变量,每次在单独的方法中使用后都会关闭,如下所示,然后通过创建新的连接器对象重新使用,将其分配给
con
,以便后续调用。这样做安全吗?还是在方法中本地创建单独的连接器对象并在finally块中关闭它更好

private void closeObjects() throws Exception{
 if(rs!=null){
 rs.close();
 rs=null;
 }
 if(preparedstmt!=null){
 preparedstmt.close();
 preparedstmt=null;
 }
 if(con!=null){
 con.close();
 con=null;
 }
}
实际上,我确实遇到了这样一个问题:当我第一次运行程序时,将其用作实例变量时,它未能给出一个错误
结果集not open
,但在第二次运行之后开始工作


[很抱歉没有显示整个代码]

我更喜欢在执行SQL操作的方法中将JDBC实例作为局部变量。这种方法使它们的生命周期变得清晰,如果您忘记在某个地方调用closeObjects(),则无需担心。若要避免代码重复,那个么创建一个方法,将它们作为参数接受,并从finally块调用它

private void closeObjects(Connection con, ResultSet rs, Statement statement) throws Exception {
    if (rs != null) {
        rs.close();
        rs=null;
    }

    if (statement != null) {
        statement.close();
        statement=null;
    }

    if (con != null) {
       con.close();
       con=null;
    }
}

视情况而定。可以同时调用该方法吗?一般来说,我认为没有理由将它们作为实例变量而不是局部变量!使用methodd创建连接对象是有益的,尤其是如果您想使用singleton来提高性能