java.sql.ResultSet:设计有缺陷?

时间:2011-09-14 15:26:50

标签: java jdbc

这是java.sql.ResultSet.next()

的签名
public boolean next() throws SQLException

众所周知,如果ResultSet中有更多行可用,则该方法返回true。 但是如果抛出SQLException怎么办?我无法获得next()的返回值,因此我无法知道是否有更多记录可用(界面中没有hasNext方法的痕迹)。

让我们切换视角。我正在研究需要容错的JDBC驱动程序(它从csv读取)。如果在错误的行之后有更多行可用,我如何让我的用户知道?

5 个答案:

答案 0 :(得分:2)

API设计没有错。 next() - 将光标从当前位置向前移动一行。因此JDBC驱动程序只有结果集的游标。每次调用next()方法时,它都会通过该游标从数据库中获取每一行。在查询表格时处理大量行的方案中遇到一些“异常”是合乎逻辑的。

由于您正在“设计”自己的基于csv的驱动程序,您可以随意更改next() API的行为。虽然签名声明它可能会抛出SQLException,但您可以编写next方法的实现,以便它返回一个空的或部分填充的对象,以使其具有容错能力。

有一些过时的技术可以找到ResultSet中的记录总数 - 例如 调用last(),然后在开始迭代之前调用ResultSet::getRow()来查找记录数。

答案 1 :(得分:1)

由您来决定您的实现是否实际上从这些方法中抛出异常,只是因为它在接口上并不会强迫您抛出它。但如果出现问题,你的司机无法确定是否有下一行,我怀疑它是否可以恢复。我的意思是,如果您的底层代码由于某种原因(网络访问,权限,硬件故障,其他一些进程从您下面删除了文件)而抛出IOException,抛出异常可能是合理的事情。

答案 2 :(得分:0)

您可以使用isLast()来确定您是否在最后一行。但是,这也会引发SQLException

答案 3 :(得分:0)

虽然大多数人都同意JDBC被各种(checked!)异常污染,异常的意思是“抱歉,我不知道,这个错误发生了”,这就是为什么它在异常发生时不返回值的原因提高。这种情况是“我失去联系”,或者发生了更糟糕的事情。

如果您知道在该行之后有一行,则返回true。

如果下一行是格式错误的行,则在获取格式错误的行时抛出异常,即使您在执行“next()”方法期间能够检测到它也是如此。

答案 4 :(得分:0)

只有在发生数据库访问错误或在关闭的结果集上调用此方法时,才会抛出

SQLException。 (参见ResulSet的Javadoc)

在这两种情况下,您都不想继续使用结果集。如果发生异常,您可能希望尝试关闭它,然后将其丢弃。

我在这里看不到问题:你要不是下一行。当问题发生时,抛出异常。

如果你想在这里找到从Exceptions中恢复的东西,那么构建一些围绕而不是试图“破坏”这些界面的常见行为。

但也许您应该考虑不首先实现用于读取CSV数据的JDBC驱动程序。