我有一个运行MySQL查询的webapp(Tomcat/Hibernate/DBCP 1.4),并且这对某个负载很有效,比如50个查询。当我通过HAProxy路由相同的中等负载(仍然只使用单个数据库)时,我遇到了故障,可能每500个查询就有一个故障。我的应用报告:HAProxy:从DBCP丢弃连接,为什么?
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 196,898 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
at sun.reflect.GeneratedConstructorAccessor210.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1117)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3567)
...
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3017)
...
同时,HAProxy的日志中显示了很多项,如:
27] mysql mysql/db03 0/0/34605 2364382 cD 3/3/3/3/0 0/0
Oct 15 15:43:12 localhost haproxy[3141]: 127.0.0.1:35500 [15/Oct/2012:15:42:50.0
的“CD”明确表明客户端超时的状态。所以,尽管我的webapp是说HAProxy拒绝接受新的连接,但HAProxy说我的webapp不接受数据。
我不包括我的HAProxy配置,因为我尝试了许多不同的参数值,结果基本相同。特别是,我已经在全局和服务器部分中将maxconn设置为高值和低值,并且在统计数据中总是发生的情况是最大会话数不超过7个。我的JDBC池大小也很高。
通常可以同时使用JDBC池和HAProxy池吗?以前有人遇到这种问题吗?
我对如何解决这个问题有一个想法,即在每个查询之前发送一个“验证查询”。但是这里有一定的开销,我仍然想知道为什么我的web应用程序直接进入MySQL时成功了,但是在通过HAProxy时会丢失连接。
如何进一步调试并获取比“cD”更多的信息?我尝试在调试模式下运行HAProxy,但似乎没有透露更多信息。
我也有类似的问题。你在下面提到你“继续前进”......你能告诉我你做了什么来解决这个问题吗? – luksch