通信链路故障问题

时间:2015-07-30 13:06:09

标签: java mysql jdbc

我托管了我的第一个Java EE网站,但我的mySQL连接在几分钟后超时,我收到此错误消息:

HTTP Status 500 - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

type Exception report

message com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

description The server encountered an internal error that prevented it from fulfilling this request.

exception

dao.DAOException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 0 ms ago.
dao.OffreDaoImpl.lister(OffreDaoImpl.java:95)
filters.PrechargementFilter.doFilter(PrechargementFilter.java:96)
org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)

root cause

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 0 ms ago.
sun.reflect.GeneratedConstructorAccessor28.newInstance(Unknown Source)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:525)
com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2985)
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:2542)
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885)
com.jolbox.bonecp.PreparedStatementHandle.executeQuery(PreparedStatementHandle.java:172)
dao.OffreDaoImpl.lister(OffreDaoImpl.java:90)
filters.PrechargementFilter.doFilter(PrechargementFilter.java:96)
org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)

root cause

java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
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:2542)
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
        com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885)
com.jolbox.bonecp.PreparedStatementHandle.executeQuery(PreparedStatementHandle.java:172)
dao.OffreDaoImpl.lister(OffreDaoImpl.java:90)
filters.PrechargementFilter.doFilter(PrechargementFilter.java:96)
org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108) 

我让我的主机增加超时值,这是他的回复:

  

请接受我们最诚挚的误解道歉。   不幸的是,由于共享托管环境,您的请求无法完成 - 它将影响其他客户,为您共享服务器资源>。 (10分钟是此参数的最大值)。   由于您非常需要某些功能 - 我们只建议您考虑>转移到VPS或专用服务器,您将拥有完整的管理员>权限,可以做任何您想做的事情,而不会影响其他>客户。

     

作为解决方案,我们建议您在以下命令中添加jdbc连接> string:   &安培; autoReconnect的=真安培; failOverReadOnly =假安培; maxReconnects为= 10

     

在这种情况下,超时后,您将再次重新连接。

所以我编辑了config.properties文件:

url = jdbc:mysql://localhost:3306/myDatabase&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
driver = com.mysql.jdbc.Driver
username = xxxxxx
password = xxxxxx

但我仍面临同样的问题。

1 个答案:

答案 0 :(得分:0)

是的,即使我托管网站,我也在使用localhost。但我试图用URL连接中的服务器地址IP替换localhost字符串,我收到此错误消息:

  

引起:java.sql.SQLException:无法打开与给定数据库的测试连接。 JDBC url = jdbc:mysql://xxx.xxx.xxx.xx:3306 / database_db?autoReconnect = true& failOverReadOnly = false& maxReconnects = 10,username = user_name。终止连接池。原始例外:------   com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:无法创建与数据库服务器的连接。尝试重新连接10次。放弃。

所以我向我的主持人注意了这个问题,这是他的回复:

  

尊敬的客户,

     

请使用localhost而不是IP地址,对于您的字符串,我们实际上要求您不要保持连接,只要您愿意。问题是我们对已打开的连接有严格的限制=每个用户300和50。

     

由于这是共享服务器,因此这些连接将按需分配给每个用户,如果您的帐户消耗50个连接,则它是所有可用连接的1/6。