MYSQL 以及JAVA 连接错误的示例分析

发布时间:2021-10-25 10:32:15 作者:柒染
来源:亿速云 阅读:144

这期内容当中小编将会给大家带来有关MYSQL 以及JAVA 连接错误的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

最近开发告诉我,他们在测试系统的时候,会经常有连接MYSQL的连接被踢掉。具体给我的解释是,JAVA的缓冲池连接MYSQL 保持连接,但再次使用的时候,报连接错误。

MYSQL 以及JAVA 连接错误的示例分析

对应应用程序的报错的时间点,查了一下 PROXYSQL  和 MYSQL 的错误日志,的确是有相关的错误。

PROXYSQL 错误日志

MYSQL 以及JAVA 连接错误的示例分析

MYSQL 的错误日志

MYSQL 以及JAVA 连接错误的示例分析

那么问题来了,到底为什么会 got timeout reading communication packets。

DBER可以冠冕堂皇的告知,这是JAVA 的问题,不是数据库的问题,但是如果作为 Architector of Databases,这样的回答的确是遭恨。

所以必须搞清楚到底是怎么回事,故事就开始了。首先JAVA 程序是有缓冲池来连接到 MYSQL 的 ProxySQL 的,而ProxySQL 作为MYSQL 的中间件和缓冲,会将JAVA的连接转接到 MYSQL (MGR  MTS)的主节点。

分析问题的一步步来,我们先从MYSQL 这个根上来

MYSQL 以及JAVA 连接错误的示例分析

从MYSQL 的角度来说,产生 Aborted_clients 和 Aborted_connects 有三个原因。

1  客户端的连接,在MYSQL中被意外的终止了,至于这个意外是什么,有可能是当前的连接被DBA 使用KILL 终止了,或者其他的PT-KILL工具之类的方式,让你的连接停掉了。

2 MYSQL 中的两个参数, wait_timeout 和 interactive_timeout ,wait_timeout 是如果连接处于 idle的状态多长时间,这个连接就会被踢掉。wait_timeout 和 interactive_timeout

wait_timeout 是你的连接的idle(空闲的时间),超过多少时间就被系统KILL 掉

interactive_timeout 是在程序和数据库交互中,的间隔时间,如果你间隔时间较长,让数据库等的不耐烦了,就给你清理掉你的连接的线程。

程序员可能会问,WHY, 这主要是每个连接都会HOLD住一定的内存,例如 sort buffer join buffer 之类的,如果这些BUFFER 初始的时候就给的挺大,那后面如果连接太多,系统就可能OOM, 所以系统必须管管那些不负责的连接,光知道开,不知道关。

那如何来确认你现在的MYSQL 的连接数,这里设置都是 1800秒,也就是30分钟。

MYSQL 以及JAVA 连接错误的示例分析

MYSQL 以及JAVA 连接错误的示例分析

说完这里,继续说PROXYSQL, 作为目前最好的开源的MYSQL 的中间件,用的人不少。

其实proxysql 也是有线程池的,我目前的PROXYSQL 就有一个主34个子线程组成。

MYSQL 以及JAVA 连接错误的示例分析

而proxysql 中的连接池也是保存空闲连接的,而多长时间PROXYSQL 会进行一个ping 保持与MYSQL之间的连接,的时间是通过 mysql-ping_interval_server_msec 来进行。

MYSQL 以及JAVA 连接错误的示例分析

而mysql-connection_max_age_ms 是当空连接在没有任何会话使用的情况下,空闲的时间超过了 mysql-connection_max_age_ms 的设置后PROXYSQL 会自动关闭这个连接。

MYSQL 以及JAVA 连接错误的示例分析

mysql-ping_timeout_server 则是PROXYSQL 为了维持和后端的空闲连接,每隔一段时间来发送PING 一次得到回复超时的时间

MYSQL 以及JAVA 连接错误的示例分析

写到这里,估计能送网上BAIDU到很多,关于这样的问题,而解决这样问题的方法,大部分是修改MYSQL的 两个timeout 的时间,默认为28800秒也就是 8个小时,他们建议将时间改为 31536000 秒,好吧我不打人,这样的程序员每月能赚2000块在北京都是多给。

最后我这个非JAVA Developer GOOGLE 出的解决方案是

在配置Druid DatasourceStat 

1 需要配置

validationQuery: select 1  (这样的语句去访问数据库避免引起性能的消耗)

testWhileIdle: true

timeBetweenEvictionRunsMillis: 的设置一定要小于 mysql 或者 proxysql 的 timeout 值

我这里 timeBetweenEvictionRunMills 的值应该是小于 3分钟。

到此 解决Communications link failure 的问题,告知段落,到目前为止还没有新的错误告诉我,阿弥陀佛。

上述就是小编为大家分享的MYSQL 以及JAVA 连接错误的示例分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. Mycat整合MySQL过程报错的解决方法
  2. mysql architecture详解

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql java

上一篇:如何用centos修改php时间

下一篇:Python爬虫经常会被封的原因是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》