作为一个整体,我读到 javadoc 说如果连接无效(意味着没有关闭且不可用),或者如果超过超时,它将返回 false。
但是,如果对数据库的连接有效性查询出现其他问题,则仍可能引发 SQLException。(例如,查询是针对缺少的数据库的所需系统表,或者事务在检查过程中回滚)。
如果超时值小于零,将始终抛出 SQLException。
话虽如此,(通常是JDBC,尤其是)这个规范存在很多问题。
什么定义了无效连接?如果试图找出一个数据库错误,我们真的可以说我们不知道连接是否有效。反正它很可能坏了。我唯一能想到的是连接仍然需要关闭,而 valid == false 可能意味着连接已死,无需关闭它。这导致了下一个问题:
Valid 没有正式定义。这意味着没有关闭和其他东西。但是其他的东西有点模糊。应该是可以用的意思,但是如果没有关闭,但是不可用怎么办?
最后,为什么对负数如此不宽容?说起来也很简单:值为 0 或更小表示超时未应用于数据库操作。
当然,isClosed()的规范没有更新以识别新的 isValid(int) 方法。
一般来说,JDBC API 确实是一种讽刺。
另一方面,如果含义是当且仅当,它应该这么说,并且如果由于任何其他原因不能抛出 SQLException,那么这应该是一个运行时异常(例如 IllegalArgumentException),因为传递一个负值只会是一个编程错误。另一方面,如果可以出于其他原因抛出 SQLException,那么至少可以说,当必须处理已检查的异常时,引入单独的异常是不值得的。我不确定我是否同意这个论点,但至少它可能有优点。(注意,我写最后一段并不是为了证明规范并不意味着当且仅当,而是作为进一步的批评,如果这就是它的意思。)