gpt4 book ai didi

jdbc - JDBC 的 Connection.isClosed() 有什么用,为什么 Snaq DBPool 在关闭时行为不端?

转载 作者:行者123 更新时间:2023-12-01 05:22:40 27 4
gpt4 key购买 nike

我在 Java 中有以下代码:

if(!conn.isClosed())
{
conn.close();
}

我没有工作,而是获得了:

java.sql.SQLException: 连接已经关闭

我的连接对象是一个 Snaq.db.CacheConnection

我检查了 JavaDocs 中的 isClosed,他们指出:

This method generally cannot be called to determine whether a connection to a database is valid or invalid. A typical client can determine that a connection is invalid by catching any exceptions that might be thrown when an operation is attempted.

所以我的问题是:

1) JDBC 的 isClosed() 到底有什么用?从什么时候开始我们在 Java 中使用异常来检查有效性?

2) 关闭数据库的正确模式是什么?我应该关闭并吞下异常吗?

3) 知道为什么 SnaqDB 会关闭连接吗? (我的后端是 Postgres 8.3)

最佳答案

我会用相应的数字回答你的问题:

  1. 我同意你的看法,isClosed 仅在尽力而为的基础上提供关闭状态似乎很奇怪,并且您的代码仍然必须准备好在关闭连接时捕获异常。我认为原因是连接可能随时被数据库关闭,因此像 isClosed 这样的查询状态方法返回的任何状态本质上都是陈旧的信息 - 状态可能会在检查 isClosed 并在 Connection 上调用 close
  2. 调用 close 不会影响您的数据和之前的查询。 JDBC 操作以同步结果执行,因此在调用 isClosed 时所有有用的执行要么成功要么失败。 (对于自动提交或显式事务边界都是如此。)如果您的应用程序是访问本地数据库的单个用户,那么向用户显示错误可能有助于他们诊断问题。在其他环境中,记录异常并吞掉它可能是最好的做法。无论哪种方式,吞下异常都是安全的,因为它与数据库的状态无关。
  3. 查看 SnaqDB 的源代码 CacheConnection , isClosed 方法委托(delegate)给底层连接。所以问题不在那里,而在于为 isClosed()Connection.close() 定义的契约(Contract)抛出异常。

关于jdbc - JDBC 的 Connection.isClosed() 有什么用,为什么 Snaq DBPool 在关闭时行为不端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2740503/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com