如何重置 JDBC Connection 对象(即 java.sql.Connection 对象)?
I have explored the concept of connection pooling. When a connection pool is used, a Connection object can be recycled. But how can a connection pool recycle a Connection object? I think that a connection needs to be "reset" (for example, if it is in a transaction, then perhaps rollback it, but there may be more things to reset) before it can be reused. But I cannot find such a "reset" method in the Java documentation about the class java.sql.Connection.
如果您正在谈论作为连接用户应该做什么,那么这很简单:调用close()连接。关闭逻辑连接将向连接池发出信号,表明该连接可以重用,然后连接池管理器负责执行必要的重置、语句句柄的失效等。
如果您正在谈论作为连接池管理器的实现者应该做什么,那么事情就变得复杂了。
从历史上看,JDBC 没有提供“重置” a 的方法,只能java.sql.Connection通过您自己的代码(或您的第三方连接池)记住初始配置并在使用后恢复它,并跟踪语句和结果集等对象并关闭当连接返回到池中时。
最初,在 JDBC 中重置连接的预期方法是让应用程序服务器使用驱动程序javax.sql.ConnectionPoolDataSource作为javax.sql.PooledConnection对象的工厂。这些PooledConnection对象作为在连接池举行,物理连接手柄(要明确,ConnectionPoolDataSource就是不是一个连接池,它是一个数据源的连接池)。然后应用服务器会公开一个javax.sql.DataSource分发的逻辑Connection对象,在那里Connection.close(),驱动程序特定的实现PooledConnection将负责任何必要的连接重置(尽管 JDBC 没有指定什么是“必要的”)。
然而,在实践中这条路线几乎从未被使用过,因为驱动程序的支持是(而且通常仍然是)参差不齐、不一致或完全不正确的,并且 JDBC 对关闭逻辑连接时需要做什么还不够清楚。世界也已转向使用不使用ConnectionPoolDataSource.
JDBC 4.3(Java的9或更高版本)推出的方法Connection.beginRequest(),并Connection.endRequest()通过连接池管理器调用,这似乎适合这样的模式,但遗憾的是JDBC 4.3实际上并没有规定什么样的东西的实现应该或不应该做回应到beginRequest和endRequest。
简而言之,在 JDBC 中没有真正通用的方法来重置连接。