2015-07-30 4 views
1

я провел свой первый веб-сайт 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 соединения> строка следующая команда: & 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 

Но я до сих пор сталкиваются с той же проблемой.

+0

проверить 'jdbc: mysql: // localhost: 3306'? 'Localhost'? – Satya

+0

http://stackoverflow.com/questions/6865538/solving-a-communications-link-failure-with-jdbc-and-mysql – Satya

+0

Привет, Сатья. Что я должен проверить: jdbc: mysql: // localhost: 3306? локальный? – Deparis

ответ

0

Да, я использую localhost, даже если у меня есть сайт. Но я пытался заменить LOCALHOST строки с помощью адреса сервера IP в связи с URL, и я получил сообщение об ошибке:

Вызванные: java.sql.SQLException: Не удается открыть тест подключение к данной базе данных. JDBC url = jdbc: mysql: //xxx.xxx.xxx.xx: 3306/database_db? AutoReconnect = true & failOverReadOnly = false & maxReconnects = 10, имя пользователя = имя_пользователя. Прекращение пула соединений. Исходное исключение: ------ com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Не удалось создать соединение с сервером базы данных. Попытка повторного подключения 10 раз. Сдаваться.

Поэтому я отметил вопрос к моему хостеру, и вот его ответ:

Уважаемый клиент,

Пожалуйста, используйте локальный вместо IP-адрес, а для строки, мы на самом деле просим вас не поддерживать соединения, пока вы этого хотите. Дело в том, что у нас есть жесткий предел для открытых соединений в целом = 300 и 50 на пользователя.

И поскольку это общий сервер, эти соединения распределяются по требованию каждому пользователю, а если ваша учетная запись потребляет 50 подключений, это составляет 1/6 всех доступных подключений.