【发布时间】:2017-06-30 11:01:56
【问题描述】:
我发现 c3p0 连接池每次为连接创建新对象时,例如假设我有 5 个连接池,并且当我在使用该连接后从池中获取连接时,然后每次获取新哈希码时再次获取连接然后如何我们可以说它是连接池..如果每次池创建一个新连接,那么池如何知道特定连接已关闭??
【问题讨论】:
我发现 c3p0 连接池每次为连接创建新对象时,例如假设我有 5 个连接池,并且当我在使用该连接后从池中获取连接时,然后每次获取新哈希码时再次获取连接然后如何我们可以说它是连接池..如果每次池创建一个新连接,那么池如何知道特定连接已关闭??
【问题讨论】:
您从连接池中获得的连接通常是物理连接的包装器(代理),这也是 c3p0 使用的方法。这是为了将实际的物理连接与其用户隔离,并允许拦截关闭操作以将连接返回到池中。此外,此包装器通过表现为封闭连接来保护物理连接(和应用程序的其他部分)免受行为不当的代码的影响。例如,尝试在关闭连接后继续使用连接的代码(这可能导致难以诊断竞争条件或其他奇怪行为)将得到连接关闭错误。
所以预计你从池中得到的连接每次都有不同的标识,因为它实际上每次都是一个新的“逻辑”连接;它只是碰巧重用(包装)了池中的物理连接。
【讨论】:
close() 时(这是一个包装器,而不是到数据库的物理连接!),这个包装器将开始表现为一个封闭的连接,而同时底层的物理连接会返回到连接池中进行复用。