连接泄漏终结者设计方案:HikariCP 中间件的先进检测策略(架构设计篇)
HikariCP 的泄漏检测设计是为了帮助开发者发现和解决数据库连接泄漏问题。连接泄漏通常发生在应用程序未能正确关闭数据库连接时,这会导致连接池中的连接被耗尽(新的请求没有可用连接对象),进而影响应用程序的性能和稳定性。
在 HikariCP 中,通过检测连接存活时间是识别和预防数据库连接泄漏。连接泄漏通常发生在应用程序代码中未能正确关闭数据库连接,导致连接资源无法释放回连接池,从而可能耗尽连接池中的所有连接。这不仅会影响应用程序的性能,还可能导致数据库服务器的资源被过度占用。因此以下的整体设计策略解决了此问题。
肖哥弹架构 跟大家“弹弹” 框架注解使用,需要代码关注
欢迎 点赞,关注,评论。
关注公号 Solomon 肖哥弹架构获取更多精彩内容
历史热点文章
1、连接泄漏解决策略
泄漏检测说明
开始:应用程序请求数据库连接。
建立数据库连接:HikariCP 建立数据库连接。
分配连接给应用程序:连接池将连接分配给请求的应用程序。
连接使用完毕? :应用程序使用完连接后,检查是否关闭了连接。
应用程序关闭连接:如果应用程序正确关闭了连接,连接返回连接池。
检测连接存活时间:如果应用程序未关闭连接,HikariCP 检测连接的存活时间。
连接处理:
对于被标记为潜在泄漏的连接,HikariCP 会采取以下行动之一:
关闭连接:如果连接超过了存活时间阈值,HikariCP 会关闭这个连接,并从连接池中移除。
保留连接:如果连接尚未超过存活时间阈值,HikariCP 可能会保留连接,直到它被应用程序关闭或超过阈值。
标记为潜在泄漏:如果连接存活时间超过配置的阈值,HikariCP 将此连接标记为潜在泄漏。
记录泄漏信息:HikariCP 记录泄漏事件的详细信息。
生成堆栈跟踪:HikariCP 生成连接创建时的堆栈跟踪,以帮助定位泄漏源。
日志记录泄漏事件:泄漏事件和堆栈跟踪信息被记录在日志中。
可选: 抛出泄漏异常:根据配置,HikariCP 可以选择抛出泄漏异常,强制应用程序处理泄漏问题。
连接返回连接池:无论是否发生泄漏,连接最终都会返回连接池,等待下一次使用。
注意:
HikariCP 的泄漏检测机制可能会在某些情况下误判,特别是当应用程序正常使用长时间运行的数据库连接时。例如,某些应用程序可能需要保持数据库连接打开以进行长时间的数据传输或处理,这种情况下,连接可能会超过 leakDetectionThreshold
设置的存活时间。
开发者根据具体的应用程序需求调整泄漏检测的敏感度:
调整泄漏检测阈值:
通过增加
leakDetectionThreshold
的值,可以为长时间运行的操作提供更长的存活时间,减少误判的可能性。使用合理的默认值:
HikariCP 默认的泄漏检测阈值通常设置得足够高,以适应大多数应用程序的需求。如果应用程序中的操作通常需要较长时间,可以考虑使用默认值或适当增加阈值。
应用程序设计:
在应用程序设计时,应确保数据库连接在使用完毕后及时关闭。良好的编程实践可以减少泄漏检测机制的误判。
区分长时间操作和泄漏:
对于需要长时间保持连接的操作,可以通过设计来区分这些操作和潜在的泄漏,例如使用不同的连接池或明确标记长时间运行的连接。
2、连接存活判断标准
数据库连接存活指的是在一定时间内保持与数据库的通信状态。在使用过程中,连接可能会因为长时间空闲、超时或应用程序逻辑错误而变得无效。为了确保连接的有效性和资源的合理利用,需要定期检测连接的存活状态。如果连接仍然活跃,它将继续被用于数据库操作;如果连接已失效,系统将关闭并从连接池中移除该连接,释放资源以供其他请求使用。这种机制有助于维护连接池的健康,防止资源耗尽,并提高应用程序的性能和稳定性。
判断说明
开始:应用程序启动,准备建立数据库连接。
建立数据库连接:HikariCP 创建新的数据库连接。
配置心跳检测:设置心跳检测的 SQL 查询,如
SELECT 1
。设置连接超时:配置连接的空闲超时时间。
配置连接测试查询:配置用于测试连接是否存活的 SQL 查询。
执行心跳检测:定期执行心跳检测查询,检查连接是否仍然有效。
检测结果:根据心跳检测的结果判断连接是否存活。
标记为活跃:如果连接存活,将其标记为活跃状态。
尝试自动重连:如果连接失效,尝试自动重新连接到数据库。
重连成功? :检查自动重连是否成功。
关闭并移除连接:如果重连失败,关闭连接并从连接池中移除。
返回连接池等待下一次使用:如果连接存活,将其返回到连接池中,等待下一次使用。
记录日志并警告:如果连接被关闭,记录相关日志并发出警告。
结束:完成连接存活性检测流程。
3、 连接资源释放标准
释放数据库连接是为了重用资源、避免资源泄漏、减少系统开销,并确保连接池中的连接保持活跃和有效。
数据库连接释放标准
开始:应用程序请求使用数据库连接。
应用程序使用数据库连接:应用程序执行数据库操作,如查询、更新等。
操作完成? :检查应用程序是否完成了对数据库的所有操作。
应用程序关闭连接:如果操作完成,应用程序关闭数据库连接。
连接返回连接池:关闭的连接返回到连接池中,等待被其他操作使用。
检查连接状态:连接池检查连接的有效性。
有效:如果连接仍然有效,它将保持在连接池中,以便快速重用。
无效:如果连接无效,它将被关闭并从连接池中移除。
空闲超时检查:连接池定期检查连接的空闲时间。
超时:如果连接在连接池中空闲超过预设的超时时间(
idleTimeout
),则关闭该连接。未超时:如果连接未超过空闲超时时间,它将保持在连接池中。
手动调用关闭方法:应用程序可以通过调用 HikariCP 的关闭方法来手动释放连接。
关闭所有连接:当连接池本身被关闭时,所有连接都将被关闭并释放资源。
释放数据库资源:对于被关闭的连接,释放与数据库相关的资源。
结束:连接释放流程结束,资源被回收。
版权声明: 本文为 InfoQ 作者【肖哥弹架构】的原创文章。
原文链接:【http://xie.infoq.cn/article/427391c1f95e18a076555af94】。文章转载请联系作者。
评论