当我从DataSource
获取一个Connection
时,我是否应该手动关闭它?我的意思是,如果我必须关闭它,在未来的请求中它又会如何使用?
当我从DataSource
获取一个Connection
时,我是否应该手动关闭它?我的意思是,如果我必须关闭它,在未来的请求中它又会如何使用?
Connection.close
方法关闭逻辑连接。这会关闭逻辑连接但不会关闭物理连接。相反,物理连接将返回到池中以便重复使用。”Connection.close()
!无论它是物理连接还是从池中获取的逻辑连接。close()
操作可能因实现的细节而异,并且某些实现在这方面上是有缺陷的 - 将失效逻辑连接并向连接池发出底层物理连接可供重用的信号。连接池可以进行一些有效性检查,然后将(物理)连接返回到池中或关闭它(例如,如果池中有太多空闲连接,或者连接过期等)。close()
不仅是允许的,而且对于连接池的正常工作非常重要。如果不调用close()
,通常需要一些辅助线程来关闭(回收)长时间使用的逻辑连接。由于这个超时通常比正常应用程序需求更长,它可能导致池的耗尽,或者配置需要比实际必要的更高的最大连接数的情况。为了将连接返回到池中,您应该关闭 Connection
。下次您请求来自池的 Datasource.getConnection()
连接时,将获取该连接。这里没有问题。
有时您不想在每个操作之后关闭连接,而是要对多个操作使用同一个连接。在这种情况下,直到最后一个操作完成之前,您不应该关闭它。
try (Connection con = ds.getConnection();
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(...)) {...}