在什么情况下statement.close会引发异常?对连接意味着什么?

时间:2018-08-01 14:54:15

标签: java database jdbc database-connection

我们到处都可以看到Statement.close()通过吞噬它抛出的异常而得到“处理”。首先可以在什么情况下引发异常?对于创建此语句的连接意味着什么?

换句话说,statement.close()何时会引发异常,并且连接仍然“健康”以用于创建新语句?

此外,如果resultet.close()抛出该怎么办?

3 个答案:

答案 0 :(得分:1)

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

例如PreparedStatement 可能已经创建了一个存储过程,需要使用close()方法将其删除。 executeQuery()可能已经打开了一个{em>光标,供ResultSet使用,而close()需要关闭该光标。

异常当然可以是内部错误,但很可能是通信错误,从而导致关闭操作失败。

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

但是,由于原因可能是通信错误,所以连接很可能断开了,这意味着您接下来尝试执行的任何操作都将获得另一个异常,这使得处理{{1} }例外事项。

为安全起见,异常意味着出现了问题,除非您检查异常以了解它的严重程度,否则您应该中止所做的一切。如果要重试,应建立一个新的连接

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

答案 1 :(得分:0)

这种异常的最简单的情况是:在试图关闭该语句之前,或者如果已经(某种程度上)关闭了该语句,则关闭处理该语句的连接。对于jdbc来说,连接应该是健康的。 通常,如Peter所述,如果驱动程序的文档中未包含有关如何处理此类异常的任何建议,则只能对其进行记录或调试。也许您可以重新建立连接以确保连接正常。

答案 2 :(得分:0)

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

  • 打开的结果集-如果有的话-已关闭,这可能需要与数据库进行通信
  • 数据库服务器上的语句句柄已释放,这需要与数据库进行通信

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

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

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