开发者社区> 问答> 正文

Mysql连接泄露问题

Mysql服务器wait_timeout为120秒,发现数据库连接池使用的数据库连接,在一段时间后tcp连接会变成can't identify protocol,导致句柄数逐渐累积(removeAbandoned功能已经开启)

我用的1.0.14版本的,查了线上几个应用都有类似问题,我们的mysql wait_timeout时间配置是2分钟,我用wireshark查看发现连接空闲2分钟后mysql服务器发来主动关闭的tcp包,应用这边的连接没有正常关闭,有一部分从CLOSE_WAIT变成了can't identify protocol。 准备升级高版本测试,看了下maxEvictableIdleTimeMillis和phyTimeoutMillis好像都是解决这个问题的,不知应该选哪个?

原提问者GitHub用户eXcellme

展开
收起
山海行 2023-07-05 21:55:41 122 0
4 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    MySQL连接泄露问题是指在使用MySQL数据库时,应用程序没有正确释放数据库连接,导致连接池中的连接被占用,无法使用,进而影响应用程序的性能和稳定性。这个问题可能会导致应用程序出现连接超时、性能下降、OOM等异常情况。

    为了避免MySQL连接泄露问题,可以采取以下措施:

    使用连接池:连接池可以有效地管理数据库连接,避免连接的泄露。连接池可以根据应用程序的需要,动态地分配和回收连接,保证连接的可用性。

    使用try-with-resources语句:在使用JDBC连接MySQL时,可以使用try-with-resources语句,确保连接等资源被正确释放。例如:

    Copy
    try (Connection conn = dataSource.getConnection();
    PreparedStatement ps = conn.prepareStatement(sql)) {
    // 执行SQL语句
    }
    配置连接超时和闲置超时:连接池可以配置连接的超时和闲置超时时间,超过指定时间未被使用的连接会被回收。可以通过配置连接池的参数,避免连接的长时间占用和泄露。

    使用连接池监控工具:连接池监控工具可以帮助开发人员监控连接池的使用情况,及时发现连接泄露等问题,保证应用程序的性能和稳定性。常用的连接池监控工具包括Druid和HikariCP等。

    2023-07-30 09:38:39
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    在处理MySQL连接泄漏问题时,您可以考虑使用连接池的配置参数来解决。在您的情况下,可以尝试调整以下两个参数:maxEvictableIdleTimeMillisphyTimeoutMillis

    1. maxEvictableIdleTimeMillis参数定义了一个连接在池中最长的空闲时间。当连接空闲时间超过此值时,连接将被标记为可回收,并且在下次连接池清理时将被回收。可以将此参数设置为小于MySQL服务器的wait_timeout值(120秒),以确保连接在MySQL关闭之前被回收。

    2. phyTimeoutMillis参数用于定义应用程序与MySQL服务器之间的物理连接超时时间。当连接超过此时间没有任何读写操作时,连接将被关闭并从连接池中释放。您可以将此参数设置为小于MySQL服务器的wait_timeout值(120秒),以确保连接在MySQL关闭之前被正确释放。

    请注意,这两个参数的设置可能因不同的连接池实现而有所差异。确保您所使用的连接池支持这些参数,并按照连接池的文档进行正确的配置。

    尝试调整上述参数并进行测试,以查看是否对连接泄露问题有所改善。如果问题仍然存在,您可能需要进一步检查您的应用程序代码,确保在使用连接之后正确地关闭和释放连接。

    希望这些信息对您有所帮助!如果您还有其他问题,请随时向我提问。

    2023-07-11 16:22:06
    赞同 展开评论 打赏
  • 是这个参数 timeBetweenEvictionRunsMillis起作用,检测空闲连接的时间间隔

    原回答者GitHub用户zhangjianweibj

    2023-07-06 12:30:18
    赞同 展开评论 打赏
  • 对于MySQL连接泄露问题,您可以考虑调整maxEvictableIdleTimeMillisphyTimeoutMillis参数来解决。

    1. maxEvictableIdleTimeMillis是Druid连接池的一个配置项,表示连接在连接池中最大空闲时间。如果连接在指定的时间段内处于空闲状态,则会被移除并关闭。您可以将此值设置为小于MySQL的wait_timeout时间,例如设置为110秒(稍小于120秒)。

    2. phyTimeoutMillis是Druid连接池的物理连接超时设置。它定义了从连接池借用连接到归还连接的最长时间间隔。如果连接在指定的时间段内没有被成功归还,则会被强制回收。您可以根据需要将此值设置得稍微大于maxEvictableIdleTimeMillis,以确保连接能够正常归还。

    建议您首先尝试调整maxEvictableIdleTimeMillis的值,将其设置为小于wait_timeout的时间,并观察是否能够解决连接泄露问题。如果问题仍然存在,再考虑调整phyTimeoutMillis的值。

    2023-07-06 10:55:28
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像