我们到处都可以看到Statement.close()通过吞噬它抛出的异常而得到“处理”。首先可以在什么情况下引发异常?对于创建此语句的连接意味着什么?
换句话说,statement.close()何时会引发异常,并且连接仍然“健康”以用于创建新语句?
此外,如果resultet.close()抛出该怎么办?
答案 0 :(得分:1)
首先,请考虑close()
方法可能需要做什么以及可能导致异常的原因。
例如PreparedStatement
可能已经创建了一个存储过程,需要使用close()
方法将其删除。 executeQuery()
可能已经打开了一个{em>光标,供ResultSet
使用,而close()
需要关闭该光标。
异常当然可以是内部错误,但很可能是通信错误,从而导致关闭操作失败。
那是什么意思?这意味着没有明确清除资源。由于您的操作已经完成,因此通常可以忽略这些close()
异常,因为无论如何最终都会回收资源。
但是,由于原因可能是通信错误,所以连接很可能断开了,这意味着您接下来尝试执行的任何操作都将获得另一个异常,这使得处理{{1} }例外事项。
为安全起见,异常意味着出现了问题,除非您检查异常以了解它的严重程度,否则您应该中止所做的一切。如果要重试,应建立一个新的连接 。
但是,正如已经提到的,忽略close()
异常并不是什么大问题。这可能会导致资源泄漏,但是如果问题很严重,无论如何您将在下一步操作中遇到另一个异常。
答案 1 :(得分:0)
这种异常的最简单的情况是:在试图关闭该语句之前,或者如果已经(某种程度上)关闭了该语句,则关闭处理该语句的连接。对于jdbc来说,连接应该是健康的。 通常,如Peter所述,如果驱动程序的文档中未包含有关如何处理此类异常的任何建议,则只能对其进行记录或调试。也许您可以重新建立连接以确保连接正常。
答案 2 :(得分:0)
关闭语句时,可能会发生很多事情。在关闭语句时,可能会发生以下基本情况:
鉴于这涉及到与数据库的通信,因此可能会发生各种错误:文件系统错误,网络连接问题等。可以安全地忽略这些错误,但也可能表明您的应用程序或数据库存在某些错误。
语句关闭的次要作用可能是事务完成(提交或回滚)。例如,在执行产生结果集的数据修改语句时,这可能会在自动提交模式下发生:当结果集被语句的关闭所关闭时,事务结束。如果此事务提交失败,而您忽略了它,则您的应用程序可能刚刚发生了数据丢失事件(因为数据没有持久保存),您只是继续忽略了它。
换句话说:除非您完全确定不会有任何有害影响,否则您不应该只是忽略或吞并Statement.close()
中的异常。至少要记录它们,以便您可以在日志中跟踪它们(并可以定义有关记录的异常数量的警报),但是请始终考虑是否需要将它们包装在特定于应用程序的异常中,并将它们放在更高的调用链中进行处理,或-提交失败-如果您需要重试。