假设我正在进行 JDBC 调用,并且我已将数据从数据库提取到 ResultSet
。但是由于网络问题,我失去了与数据库的连接。
(Connection
、Statement
和 ResultSet
在 DB 中未关闭)。我还能迭代 ResultSet
吗?
最佳答案
即使可以,也不应该,除非您针对非常具体的 jdbc 驱动程序进行编码。在某些情况下,根本不会构建结果集。在其他 (Oracle IIRC) 中,您可以对其进行配置,以便它只从总数中提取给定数量的行。
但是,一般来说,如果失去连接,您需要担心的事情比想知道是否可以遍历部分获取的结果集对象要多。在这种情况下,经验法则是
- 做最坏的打算;
- 尝试关闭结果集, 语句和连接;即使 物理连接丢失, 可能有像内存这样的资源 和调用方的文件句柄 需要处理掉;
- 如果可能,尝试获得一个新的 连接(无论是一个新的物理 一个或来自连接池)和 重新开始。
此外,根据经验,在事务中执行语句时,您不应该担心部分失败。丢弃并重新尝试。
在极少数情况下,数据库会向您发送供应商特定代码 (SQLException.getErrorCode()),告诉您是否可以重试该操作。 Oracle 有一些特定的代码(不记得它们),用于在您执行插入并且违反了唯一约束的情况下。有时可以重试此类失败的操作,但这是特定于供应商和业务的。
一般情况下,只需转储损坏的结果集并重新开始。
关于java - 连接损坏后 ResultSet 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/951770/