Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该先关闭哪一个,准备好的报表还是连接?_Java_Jdbc_Connection_Prepared Statement - Fatal编程技术网

Java 我应该先关闭哪一个,准备好的报表还是连接?

Java 我应该先关闭哪一个,准备好的报表还是连接?,java,jdbc,connection,prepared-statement,Java,Jdbc,Connection,Prepared Statement,在JDBC中使用PreparedStatement时,我应该先关闭PreparedStatement还是先关闭连接?我刚刚看到一个代码示例,其中首先关闭了连接,但在我看来,首先关闭PreparedStatement更符合逻辑 有没有一个标准的,公认的方法来做到这一点?这有关系吗?关闭连接是否也会导致PreparedStatement关闭,因为PreparedStatement与连接对象直接相关?语句。我希望你(按顺序)关门 结果集 声明 连接 (并检查沿途是否存在空值!) i、 e.按与打开顺序

在JDBC中使用
PreparedStatement
时,我应该先关闭
PreparedStatement
还是先关闭
连接
?我刚刚看到一个代码示例,其中首先关闭了
连接
,但在我看来,首先关闭
PreparedStatement
更符合逻辑


有没有一个标准的,公认的方法来做到这一点?这有关系吗?关闭
连接
是否也会导致
PreparedStatement
关闭,因为
PreparedStatement
连接
对象直接相关?

语句。我希望你(按顺序)关门

  • 结果集
  • 声明
  • 连接
  • (并检查沿途是否存在空值!)

    i、 e.按与打开顺序相反的顺序关闭


    如果您使用Spring(或类似产品),那么它将为您解决此问题。或者,您可以使用and
    DbUtils.close()
    或。

    应按顺序执行以下步骤

    • ResultSet
    • PreparedStatement
    • 连接
    另外,建议在
    finally
    close中关闭所有与JDBC相关的对象,以保证关闭

    //Do the following when dealing with JDBC. This is how I've implemented my JDBC transactions through DAO....
    
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    
    try {
      conn = ....
      ps = conn.prepareStatement(...);
    
      //Populate PreparedStatement
      rs = ps.executeQuery();
    
    } catch (/*All relevant exceptions such as SQLException*/Exception e) {
      logger.error("Damn, stupid exception: " , e);
    } finally {
    if (rs != null) {
                try {
                    rs.close();
                    rs = null;
                } catch (SQLException e) {
                    logger.error(e.getMessage(), e.fillInStackTrace());
                }
            }
    
            if (ps != null) {
                try {
                    ps.close();
                    ps = null;
                } catch (SQLException e) {
                    logger.error(e.getMessage(), e.fillInStackTrace());
                }
            }
    
            try {
                if (conn!= null && !conn.isClosed()){
                    if (!conn.getAutoCommit()) {
                        conn.commit();
                        conn.setAutoCommit(true);
                    }
                    conn.close();
                    conn= null;
                }
            } catch (SQLException sqle) {
                logger.error(sqle.getMessage(), sqle.fillInStackTrace());
            }
    }
    

    您可以看到我已经检查了我的对象是否为空,对于连接,请先检查连接是否未自动提交。许多人没有检查它,并且意识到交易没有提交给DB。

    的确如此。某些JDBC驱动程序在连接关闭后关闭结果集或语句时会抛出异常。这是正确的。切中要害:在获取资源时按相反的顺序关闭它们。所有最终的样板文件都应该压缩成一个实用方法(例如
    DBUtils.close(rs,ps,conn);
    )。关于自动提交的建议也取决于具体情况。有时,当出现异常时,您根本不想提交。另外,显式地将引用设置为null几乎总是不需要的,因为当方法退出时,它将被取消引用,希望在这之后很快,否则该方法可能太长。@Yishai,是的,我忘了提到如果有异常并且自动提交关闭,您可以执行回滚…感谢您展示了这一点。尽管根据规范,在连接关闭时语句应该关闭,但JDBC驱动程序已被发现存在这方面的问题,因此显式关闭语句(和结果集)被认为是一种良好的做法。请按打开它们的相反顺序关闭。一切。