3 回答
![?](http://img1.sycdn.imooc.com/5333a0aa000121d702000200-100-100.jpg)
TA贡献1796条经验 获得超4个赞
首先,考虑该close()
方法可能需要做什么,以及什么可能导致异常。
例如,aPreparedStatement
可能创建了一个存储过程,该过程需要由该close()
方法删除。executeQuery()
可能打开了一个游标,它被 使用ResultSet
,并且close()
需要关闭该游标。
异常当然可能是内部错误,但很可能是通信错误,导致关闭操作无法成功。
那么,这意味着什么?这意味着资源没有被明确清理。由于您的操作已经完成,因此通常可以忽略这些close()
异常,因为无论如何最终都会回收资源。
但是,由于原因可能是通信错误,因此连接可能已中断,这意味着您接下来尝试的任何操作都会遇到另一个异常,从而使您处理close()
异常的可能性更小。
为安全起见,异常意味着某些事情是错误的,除非您检查异常以了解它的严重程度,否则您应该中止正在执行的任何操作。如果您想再试一次,则应建立新连接。
但是,正如已经提到的,忽略close()
异常并不是一个大问题。这可能会导致资源泄漏,但如果问题很严重,那么无论如何您都会在下一个操作中遇到另一个异常。
![?](http://img1.sycdn.imooc.com/5458692c00014e9b02200220-100-100.jpg)
TA贡献1799条经验 获得超6个赞
当您关闭一个语句时,可能会发生很多事情。关闭语句时可能会发生以下基本情况:
打开的结果集 - 如果有 - 已关闭,这可能需要与数据库通信
数据库服务器上的语句句柄被释放,需要与数据库通信
鉴于这涉及到与数据库的通信,可能会发生各种错误:文件系统错误、网络连接问题等。这些可以安全地忽略,但也可能表明您的应用程序或数据库存在严重问题。
语句关闭的次要效果可以是事务完成(提交或回滚)。例如,当您执行生成结果集的数据修改语句时,这可能会在自动提交模式下发生:当结果集在语句结束时关闭时,事务结束。如果此事务提交失败,而您忽略它,则您的应用程序可能刚刚发生了数据丢失事件(因为数据未持久化),而您只是继续忽略它。
换句话说:Statement.close()
除非您绝对确定不会有不利影响,否则您不应该只是忽略或吞下异常。至少记录它们,以便您可以在日志中跟踪它们(并且可能定义关于记录的异常数量的警报),但始终考虑是否需要将它们包装在特定于应用程序的异常中,并将它们抛出更高的调用链以进行处理,或者 - 对于提交失败 - 如果您需要重试任何事情。
![?](http://img1.sycdn.imooc.com/5458472300015f4702200220-100-100.jpg)
TA贡献1836条经验 获得超13个赞
此类异常的最简单情况:处理语句的连接在您尝试关闭该语句之前已关闭,或者该语句是否已关闭 - 不知何故 - 已经。对于 jdbc,连接应该是健康的。一般情况:正如 Peter 所说,如果驱动程序的文档没有包含任何关于如何处理此类异常的建议,您只能记录或调试它。也许您可以重新建立连接以确保它是健康的。
添加回答
举报