是否应手动关闭从数据源获取的连接?
当我从 中得到 a 时,我应该手动关闭它吗?我的意思是,如果我必须关闭它,它将如何在将来的请求中使用?Connection
DataSource
当我从 中得到 a 时,我应该手动关闭它吗?我的意思是,如果我必须关闭它,它将如何在将来的请求中使用?Connection
DataSource
从连接池获取的连接应与普通连接完全相同。JDBC 4.2 规范(第 11.1 节)对池化进行了说明:
当应用程序使用完连接后,它将使用
方法 Connection.close
关闭逻辑连接。这将关闭逻辑连接,但不关闭物理连接。相反,物理连接将返回到池中,以便可以重用。连接池对客户端是完全透明的:客户端获取池化连接并按照获取和使用非池化连接的方式使用它。
(强调我的)
这意味着当您完成连接时,您总是打电话!无论是物理连接还是来自池的逻辑连接,都无关紧要。Connection.close()
原因是,连接是物理(直接)连接还是逻辑连接应该纯粹是配置问题,而不是仅使用该连接的应用程序代码的问题。
在连接池的情况下,will - 细节可能会有所不同,并且某些实现在这方面是错误的 - 使逻辑连接无效,并向连接池发出信号,表明底层物理连接可供重用。连接池可能会进行一些有效性检查,然后将(物理)连接返回到池中或将其关闭(例如,如果池中有太多的空闲连接,或者连接太旧等)。close()
呼叫不仅是允许的,甚至对于连接池的正确工作也至关重要。不调用通常需要一些帮助程序线程来关闭(回收)已使用时间过长的逻辑连接。由于此超时通常比正常的应用程序需要长,因此可能会导致池耗尽,或者导致配置池需要的最大连接数高于实际需要的数量。close()
close()
您应该关闭以将其返回到池,下次您将要求从池中获取连接。这里没有问题。有时,您不希望在每次操作后关闭连接,而是对多个操作使用相同的连接。在这种情况下,在最后一个操作完成之前,不应关闭它。Connection
Datasource.getConnection()