首先,我知道这个问题被多次询问,但对我来说,我猜的再现情况差别不大(很可能)。
对于mysql运行状况检查,我们进行简单的选择查询(从双选择1)。 一旦mysql服务器闲置一段时间(大约1分钟)并且我们尝试健康检查,我们就会遇到这个问题..
通信链路故障\ n \ n发送到服务器的最后一个数据包是4毫秒前
“message”:“无法读取服务器的响应。预计读取4个字节,在连接意外丢失之前读取0个字节。”, “stack”:[“com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2431)”,“com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2882)”, “com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2871)”, “com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3414)”, “com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)”, “com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)”, “com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)”, “com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)”, “com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:734)”, “org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:264)”,
如果我们再次尝试,我们立即获得成功连接,一切正常。所以它非常零星。
我看过这个stackoverflow帖子com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
所有这些可能性......我会回答其中的一些 -
JDBC URL中的IP地址或主机名错误。 -NO(通信失败后第二次尝试)
本地DNS服务器无法识别JDBC URL中的主机名。 - (与步骤1相同的原因)
JDBC URL中缺少或错误端口号。 - (与步骤1相同的原因)
数据库服务器已关闭。 -NO-(服务器已启动并正在运行)
数据库服务器不接受TCP / IP连接。 - (与步骤1相同的原因)
数据库服务器连接已用完。 - 没有(我的连接数增加到1000)
Java和DB之间的某些东西阻止了连接,例如防火墙或代理。
是。代理配置如下:
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
我的etc / my.conf细节很少如下 -
connect_timeout = 10
wait_timeout = 28800
bind-address = 0.0.0.0
max_connections = 1000
为了创建连接,我使用的是公共dbcp datasource(org.apache.commons.dbcp.BasicDataSource)
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("url");
dataSource.setUsername("username");
dataSource.setPassword("pwd");
dataSource.getConnection();
请帮我找出可能出错的地方..它是导致问题的代理配置还是其他什么?非常感谢帮助。
答案 0 :(得分:1)
- JDBC URL中的IP地址或主机名错误。 -NO(它在通信失败后第二次尝试工作)
醇>
不,因为您已达到executeStatement()
,这意味着您已经建立了连接并且PreparedStatement
。
- 本地DNS服务器无法识别JDBC URL中的主机名。 - (与步骤1相同的原因)
醇>
正确。
- JDBC URL中缺少或错误端口号。 - (与步骤1相同的原因)
醇>
正确。
- 数据库服务器已关闭。 -NO-(服务器已启动并正在运行)
醇>
与(1),(2),(3)相同的原因。
- 数据库服务器不接受TCP / IP连接。 - (与步骤1相同的原因)
醇>
正确。
- 数据库服务器连接已用完。 - 没有(我的连接数增加到1000)
醇>
与(1),(2),(3),(4),(5)相同的原因。
- Java和DB之间的某些东西阻止了连接,例如防火墙或代理。
醇>
不,原因与(1),(2),(3),(4),(5),(6)相同。
建立连接后,您的通信失败。这排除了你在这里提到的一切。剩下的是(a)服务器或网络中的瞬态条件,(b)客户端的连接池特性,(c)JDBC驱动程序提交的一些灾难性错误命令等。最有可能(a) )。