先給答案:要關閉
官方文檔:https://docs.oracle.com/javase/tutorial/jdbc/basics/sqldatasources.html#pooled_connection
我們以 HikariDataSource 為例子
@Autowired DataSource dataSource; Connection con = dataSource.getConnection(); con.close();
dataSource 會注入 HikariDataSource 對象,該對象實現了DataSource接口
public class HikariDataSource extends HikariConfig implements DataSource, Closeable
dataSource.getConnection() 獲取的連接是一個代理對象 com.zaxxer.hikari.pool.ProxyConnection,看下close方法,並不是真的關閉了TCP連接,而是回收了。
@Override public final void close() throws SQLException { // Closing statements can cause connection eviction, so this must run before the conditional below closeStatements(); if (delegate != ClosedConnection.CLOSED_CONNECTION) { leakTask.cancel(); try { if (isCommitStateDirty && !isAutoCommit) { delegate.rollback(); lastAccess = currentTime(); LOGGER.debug("{} - Executed rollback on connection {} due to dirty commit state on close().", poolEntry.getPoolName(), delegate); } if (dirtyBits != 0) { poolEntry.resetConnectionState(this, dirtyBits); lastAccess = currentTime(); } delegate.clearWarnings(); } catch (SQLException e) { // when connections are aborted, exceptions are often thrown that should not reach the application if (!poolEntry.isMarkedEvicted()) { throw checkException(e); } } finally { delegate = ClosedConnection.CLOSED_CONNECTION; poolEntry.recycle(lastAccess); } } }