Java 在什么情况下,statement.close可以引发异常?这对连接意味着什么?

Java 在什么情况下,statement.close可以引发异常?这对连接意味着什么?,java,database,jdbc,database-connection,Java,Database,Jdbc,Database Connection,无论在哪里,我们都可以看到语句.close()是通过吃掉它抛出的异常来“处理”的。在什么情况下,它可以首先抛出异常?这对创建此语句的连接意味着什么 换句话说,statement.close()何时抛出异常,并且连接是否仍然“健康”以用于创建新语句 另外,如果resultset.close()抛出这样一个异常,会发生什么情况?这种异常最简单的情况是:处理语句的连接在您试图关闭语句之前关闭,或者如果语句已经关闭(不知何故)。对于jdbc来说,连接应该是健康的。 一般来说:正如Peter所说,如果驱动

无论在哪里,我们都可以看到语句.close()是通过吃掉它抛出的异常来“处理”的。在什么情况下,它可以首先抛出异常?这对创建此语句的连接意味着什么

换句话说,statement.close()何时抛出异常,并且连接是否仍然“健康”以用于创建新语句


另外,如果resultset.close()抛出这样一个异常,会发生什么情况?

这种异常最简单的情况是:处理语句的连接在您试图关闭语句之前关闭,或者如果语句已经关闭(不知何故)。对于jdbc来说,连接应该是健康的。
一般来说:正如Peter所说,如果驱动程序的文档中没有任何关于如何处理此类异常的建议,那么您只能记录或调试它。也许您可以重新建立连接以确保它是健康的。

< P>首先,考虑<代码>关闭()>代码>方法可能需要做什么,以及什么会引起异常。 例如,
PreparedStatement
可能创建了一个存储过程,需要使用
close()
方法删除该存储过程
executeQuery()
可能打开了一个游标,该游标由
ResultSet
使用,
close()
需要关闭该游标

异常当然可能是内部错误,但最有可能是通信错误,阻止关闭操作成功

那么,这意味着什么?这意味着没有明确清理资源。由于您的操作已经完成,因此通常可以忽略那些
close()
异常,因为资源最终将被回收

但是,由于原因可能是通信错误,因此连接可能已断开,这意味着无论下一步尝试什么,您都会遇到另一个异常,这使得处理
close()
异常更不重要

为了安全起见,异常意味着出现了问题,除非您检查异常以了解其严重性,否则您应该中止正在执行的任何操作。如果要重试,应建立新连接


但是,正如前面提到的,忽略
close()
异常并不是什么大问题。这可能会导致资源泄漏,但如果问题严重,您的下一个操作无论如何都会出现另一个异常。

关闭语句时,可能会发生很多事情。在结束语句时可能会发生以下基本情况:

  • 打开的结果集(如果有)关闭,这可能需要与数据库通信
  • 数据库服务器上的语句句柄已释放,这需要与数据库通信
由于这涉及到与数据库的通信,因此可能会发生各种错误:文件系统错误、网络连接问题等。可以安全地忽略这些错误,但也可能表明应用程序或数据库存在严重错误

语句关闭的第二个效果可能是事务完成(提交或回滚)。例如,在自动提交模式下,当您执行生成结果集的数据修改语句时,可能会发生这种情况:当结果集被语句关闭时,事务结束。如果此事务提交失败,而您忽略了它,则您的应用程序可能刚刚发生了数据丢失事件(因为数据没有持久化),而您只是继续并忽略了它


换句话说:您不应该忽略或接受
语句.close()
中的异常,除非您绝对确定不会产生有害影响。至少在日志中记录它们,这样您就可以在日志中跟踪它们(并且可能定义关于异常记录的数量的警报),但是总是考虑如果需要在特定于应用程序的异常中包装它们,并将它们扔向调用链更高的位置进行处理,或者-对于提交失败-如果您需要重试任何操作。

这取决于您使用的驱动程序。除非驱动程序记录在
close()
抛出异常时要采取的操作,否则我会将其记录为debug,并尝试得出您自己的结论或忽略它。“无论我们看到什么地方,语句.close()都是通过吃掉异常来“处理”的”异常声明需要异常证据。我只接受/忽略toy应用程序中的异常,或者如果我确信可以安全地忽略异常,否则至少我会记录它,或者将它包装在特定于应用程序的异常中(通常是运行时,有时会选中)。在关闭语句上调用
close()
不应引发异常。JDBC规范规定(从JDBC 4 IIRC开始),在已经关闭的对象上的
close()
是禁止操作的。由于关闭连接会关闭其语句,关闭关闭连接上的语句也不会导致异常。忽略它不是完全安全的,例如在自动提交模式下,语句close可以触发事务完成,这可能导致提交失败。这意味着您刚刚忽略了一个事件,这意味着您可能丢失了数据。@markrottveel True。我没有考虑过,因为我从不运行自动提交模式。