gpt4 book ai didi

mysql - DB连接池过期了怎么办?

转载 作者:行者123 更新时间:2023-11-29 08:39:03 24 4
gpt4 key购买 nike

连接池过期后,当我尝试并行打开的连接数超过池中允许的最大连接数时,我在尝试从池中获取连接时开始出现超时异常。

这是预料之中的,但是,池似乎保持在这种状态,从那一刻起我所做的所有其他事情都会得到相同的超时异常。就好像池中的每个连接都处于忙碌状态,并且无法重用。我希望随着时间的推移,连接会被释放,然后其他连接也会被允许,但这并没有发生。

我使用 Play 1.2.5 和 mysql 的 jdbc 驱动程序,从日志中我认为池是 C3P0。

我没有明确关闭连接,因为我相信使用池时这样做是正确的,但我不是 100% 确定。

我不知道这是否可能是我正在使用的框架/库之一的连接泄漏,或者我是否做错了什么或没有做我应该做的事情。

当我捕获一个超时异常时,正确的做法是什么?

最佳答案

使用连接池时,您必须显式关闭连接。连接池具有数据库物理连接的集合。当您从池中请求连接时,它会将该物理连接标记为正在使用,并为您提供该连接的逻辑句柄。该逻辑句柄本质上是一个包装器或代理,它将大多数方法调用(直接或经过一些修改)转发到物理连接。

当您在此逻辑句柄上调用 close() 时,连接池会收到一个信号,表明物理连接再次可用(即:可以返回到pool),逻辑句柄从此将表现为关闭的连接,但实际的物理连接仍然打开。如果您不调用 close(),连接池永远不会收到此信号,因此物理连接将保持使用中状态并且无法重复使用.

一些高级池配置允许池检测这种情况(例如使用超时,或者可能使用终结器等)并回收连接,但您不应该依赖于此。

TL;DR: 当您使用完连接后,始终对连接调用 close(),无论它来自连接池还是非池DataSourceDriverManager

关于mysql - DB连接池过期了怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14383735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com