为了账号安全,请及时绑定邮箱和手机立即绑定

在什么情况下 statement.close 可以抛出异常?这对连接意味着什么?

在什么情况下 statement.close 可以抛出异常?这对连接意味着什么?

慕莱坞森 2021-06-17 18:01:08
我们到处都看到 Statement.close() 是通过吃掉它抛出的异常来“处理”的。它首先可以抛出异常的情况是什么?这对于创建此语句的连接意味着什么?换句话说,statement.close() 什么时候抛出异常,连接是否仍然“健康”以用于创建新语句?另外,如果 resultset.close() 抛出会发生什么?
查看完整描述

3 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

首先,考虑该close()方法可能需要做什么,以及什么可能导致异常。

例如,aPreparedStatement 可能创建了一个存储过程,该过程需要由该close()方法删除。executeQuery()可能打开了一个游标,它被 使用ResultSet,并且close()需要关闭该游标。

异常当然可能是内部错误,但很可能是通信错误,导致关闭操作无法成功。

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

但是,由于原因可能是通信错误,因此连接可能已中断,这意味着您接下来尝试的任何操作都会遇到另一个异常,从而使您处理close()异常的可能性更小。

安全起见,异常意味着某些事情是错误的,除非您检查异常以了解它的严重程度,否则您应该中止正在执行的任何操作。如果您想再试一次,则应建立新连接。

但是,正如已经提到的,忽略close()异常并不是一个大问题。这可能会导致资源泄漏,但如果问题很严重,那么无论如何您都会在下一个操作中遇到另一个异常。


查看完整回答
反对 回复 2021-06-23
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

当您关闭一个语句时,可能会发生很多事情。关闭语句时可能会发生以下基本情况:

  • 打开的结果集 - 如果有 - 已关闭,这可能需要与数据库通信

  • 数据库服务器上的语句句柄被释放,需要与数据库通信

鉴于这涉及到与数据库的通信,可能会发生各种错误:文件系统错误、网络连接问题等。这些可以安全地忽略,但也可能表明您的应用程序或数据库存在严重问题。

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

换句话说:Statement.close()除非您绝对确定不会有不利影响,否则您不应该只是忽略或吞下异常。至少记录它们,以便您可以在日志中跟踪它们(并且可能定义关于记录的异常数量的警报),但始终考虑是否需要将它们包装在特定于应用程序的异常中,并将它们抛出更高的调用链以进行处理,或者 - 对于提交失败 - 如果您需要重试任何事情。


查看完整回答
反对 回复 2021-06-23
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

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


查看完整回答
反对 回复 2021-06-23
  • 3 回答
  • 0 关注
  • 499 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信