如何重置JDBC连接对象?



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

我探讨了连接池的概念。使用连接池时,可以回收connection对象。但是连接池如何回收connection对象呢?我认为一种联系需要"重置"。(例如,如果它在事务中,那么可能回滚它,但可能有更多的东西需要重置),然后才能重用它。但我找不到这样的"重置"。关于Java .sql. connection类的方法。

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

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

从历史上看,JDBC没有提供"重置"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并没有实际指定实现应该或不应该做什么样的事情来响应beginRequestendRequest

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

是否尝试关闭()方法并重新初始化连接对象

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

最新更新