如何重置 JDBC 连接对象?

How to reset a JDBC Connection object?

如何重置 JDBC 连接对象(即 java.sql.Connection 对象)?

我探索了连接池的概念。当使用连接池时,可以回收一个Connection对象。但是一个连接池怎么回收一个Connection对象呢?我认为一个连接需要被“重置”(例如,如果它在一个事务中,那么也许回滚它,但可能有更多的东西要重置)才能被重用。但是我在关于 class java.sql.Connection.

的 Java 文档中找不到这样的“重置”方法

您是否尝试关闭 close() 方法并重新初始化 Connection 对象。

关闭() 立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们自动释放

如果您是在谈论您作为连接的用户应该做什么,那么这很简单:在连接上调用 close()。关闭逻辑连接将向连接池发出连接可重用的信号,然后连接池管理器负责执行必要的重置、语句句柄的无效等。

如果您在谈论作为连接池管理器的实施者应该做什么,那就是事情变得复杂的地方。

从历史上看,JDBC 没有提供 'reset' 和 java.sql.Connection 的方法,除非您自己的代码(或您的第三方连接池)记住初始配置,然后恢复使用后,跟踪语句和结果集等对象,并在连接返回池时关闭它们。

最初,在 JDBC 中重置连接的预期方法是让应用程序服务器使用驱动程序的 javax.sql.ConnectionPoolDataSource 作为 javax.sql.PooledConnection 对象的工厂。这些 PooledConnection 对象作为连接池中物理连接的句柄(需要说明的是,ConnectionPoolDataSource 不是连接池,它是数据源 for一个连接池)。然后,应用程序服务器将公开一个 javax.sql.DataSource 分发逻辑 Connection 对象,在 Connection.close() 上,PooledConnection 的驱动程序特定实现将处理任何必要的连接重置(尽管 JDBC 未明确说明什么是 'necessary')。

然而,在实践中,这条路线几乎从未被使用过,因为驱动程序的支持是(而且通常仍然是)参差不齐、不一致或完全不正确,而且 JDBC 对究竟需要什么还不够清楚当逻辑连接关闭时完成。世界也转向使用不使用 ConnectionPoolDataSource.

的第三方连接池库

JDBC 4.3(Java 9 及更高版本)引入了连接池管理器调用的方法 Connection.beginRequest() and Connection.endRequest(),这似乎符合这种模式,但不幸的是 JDBC 4.3 实际上并没有指定一个实现应该或不应该做什么样的事情来响应 beginRequestendRequest.

简而言之,在 JDBC 中没有真正通用的重置连接的方法。