先给答案:要关闭
官方文档: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); } } }