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
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等。
在处理MySQL连接泄漏问题时,您可以考虑使用连接池的配置参数来解决。在您的情况下,可以尝试调整以下两个参数:maxEvictableIdleTimeMillis
和phyTimeoutMillis
。
maxEvictableIdleTimeMillis
参数定义了一个连接在池中最长的空闲时间。当连接空闲时间超过此值时,连接将被标记为可回收,并且在下次连接池清理时将被回收。可以将此参数设置为小于MySQL服务器的wait_timeout
值(120秒),以确保连接在MySQL关闭之前被回收。
phyTimeoutMillis
参数用于定义应用程序与MySQL服务器之间的物理连接超时时间。当连接超过此时间没有任何读写操作时,连接将被关闭并从连接池中释放。您可以将此参数设置为小于MySQL服务器的wait_timeout
值(120秒),以确保连接在MySQL关闭之前被正确释放。
请注意,这两个参数的设置可能因不同的连接池实现而有所差异。确保您所使用的连接池支持这些参数,并按照连接池的文档进行正确的配置。
尝试调整上述参数并进行测试,以查看是否对连接泄露问题有所改善。如果问题仍然存在,您可能需要进一步检查您的应用程序代码,确保在使用连接之后正确地关闭和释放连接。
希望这些信息对您有所帮助!如果您还有其他问题,请随时向我提问。
是这个参数 timeBetweenEvictionRunsMillis起作用,检测空闲连接的时间间隔
原回答者GitHub用户zhangjianweibj
对于MySQL连接泄露问题,您可以考虑调整maxEvictableIdleTimeMillis
和phyTimeoutMillis
参数来解决。
maxEvictableIdleTimeMillis
是Druid连接池的一个配置项,表示连接在连接池中最大空闲时间。如果连接在指定的时间段内处于空闲状态,则会被移除并关闭。您可以将此值设置为小于MySQL的wait_timeout
时间,例如设置为110秒(稍小于120秒)。
phyTimeoutMillis
是Druid连接池的物理连接超时设置。它定义了从连接池借用连接到归还连接的最长时间间隔。如果连接在指定的时间段内没有被成功归还,则会被强制回收。您可以根据需要将此值设置得稍微大于maxEvictableIdleTimeMillis
,以确保连接能够正常归还。
建议您首先尝试调整maxEvictableIdleTimeMillis
的值,将其设置为小于wait_timeout
的时间,并观察是否能够解决连接泄露问题。如果问题仍然存在,再考虑调整phyTimeoutMillis
的值。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。