JDBC|JDBC Connection的close方法

  • java.sql.Connection
    java.sql.Connection集成AutoCloseable接口,包含close方法,他的close方法是释放资源;使用Java 7以及更高版本实现接口后可以使用try-with-resource语法实现自动释放资源
  • javax.sql.PooledConnection
    也包含close方法,但是这个方法不是继承于AutoCloseable接口的,与上面提到的close方法不一样的是,连接池连接的close方法不一定就直接释放资源,也不是提供给调用方直接调用的方法,而是希望是连接池内部在管理连接的时候调用该实现。例如通过调用Druid连接池获得的连接的close方法,实际上并不一定是释放了IO资源,而是将连接重新回收到连接池中,Druid连接池获得的连接实际上实现了PooledConnection接口。
Closes the physical connection that this PooledConnection object represents. An application never calls this method directly; it is called by the connection pool module, or manager.

  • 网上说的Connection是否要关闭的问题,这个问题需要分清楚Connection的实例是通过DataSource里面获取的PooledConnection实现还是Connection是通过Jdbc Driver获取的ConnectionImpl,例如mysql驱动里面的com.mysql.jdbc.ConnectionImpl实现,驱动获取的Connection没有连接池管理释放网络IO资源,所以必须要close掉,而PooledConnection的close方法实际上并不是释放IO资源,而是回收到连接池里面,因此即使没有close掉也是会回收到连接池里面,并不一定非要直接close(结合上面说到的PooledConnection接口标准的注释),当然写代码的时候还是close主动回收到连接池会更好。

    推荐阅读