2015-07-30 3 views
1

Выпуск Socket Exception происходит, когда Tomcat отправляет запрос в Mysql.«Тайм-аут соединения» между Tomcat & Mysql

Это происходит примерно 10 раз в течение всего дня. Поскольку это происходит редко, это, похоже, является краеугольным вопросом. Любые входы в том, как отлаживать его дальше/исправить?

Информация об установке Tomcat on Linux; Mysql

StackTrace

java.sql.SQLException: Communication link failure: java.net.SocketException, underlying cause: Connection timed out

НАЧАТЬ NESTED ИСКЛЮЧЕНИЕ

java.net.SocketException

СООБЩЕНИЕ: Тайм-аут соединения

StackTrace:

java.net.SocketException: Connection timed out 

at java.net.SocketInputStream.socketRead0(Native Method) 

at java.net.SocketInputStream.read(SocketInputStream.java:146) 

at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1392) 

at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:1539) 

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1930) 

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1168) 

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1279) 

at com.mysql.jdbc.MysqlIO.sqlQuery(MysqlIO.java:1225) 

at com.mysql.jdbc.Connection.execSQL(Connection.java:2278) 

at com.mysql.jdbc.Connection.execSQL(Connection.java:2225) 

at com.mysql.jdbc.Statement.executeQuery(Statement.java:1163) 

at sun.reflect.GeneratedMethodAccessor47.invoke(Unknown Source) 

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 

at java.lang.reflect.Method.invoke(Method.java:622) 

at org.apache.tomcat.jdbc.pool.interceptor.AbstractQueryReport$StatementProxy.invoke(AbstractQueryReport.ja 

va:235) 

at com.sun.proxy.$Proxy16.executeQuery(Unknown Source) 

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146) 

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 

at java.lang.Thread.run(Thread.java:701) 

END NESTED ИСКЛЮЧЕНИЕ

at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:1714) 

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1930) 

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1168) 

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1279) 

at com.mysql.jdbc.MysqlIO.sqlQuery(MysqlIO.java:1225) 

at com.mysql.jdbc.Connection.execSQL(Connection.java:2278) 

at com.mysql.jdbc.Connection.execSQL(Connection.java:2225) 

at com.mysql.jdbc.Statement.executeQuery(Statement.java:1163) 

at sun.reflect.GeneratedMethodAccessor47.invoke(Unknown Source) 

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 

at java.lang.reflect.Method.invoke(Method.java:622) 

at org.apache.tomcat.jdbc.pool.interceptor.AbstractQueryReport$StatementProxy.invoke(AbstractQueryReport.ja 

va:235) 

at com.sun.proxy.$Proxy16.executeQuery(Unknown Source) 

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146) 

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 

at java.lang.Thread.run(Thread.java:701) 
+0

Вы можете подключиться к mysql atleast один раз? я имел в виду, что вы сталкиваетесь «иногда я могу подключиться, иногда я не вопрос»? –

+0

@FathahRehmanP: В большинстве случаев соединение успешно. Эта проблема возникает примерно 10 раз в течение целого дня. Очень редкое явление. –

+0

@ MichaelMassey- я думаю, что мой ответ решит вашу проблему. –

ответ

0

Пожалуйста, убедитесь, что в вашем приложении вы закрываете соединение после использования. Если вы не закрываете соединение, то через некоторое время он достигнет максимального количества соединений. После этого вы не можете создать соединение. Только после достижения таймаута mysql закроет это соединение (которое вы должны закрыть на самом деле). После этого вы можете использовать это соединение. Так что любезно проверьте код закрытия соединения.

+0

Хотя я проверил код несколько раз, позвольте мне снова проверить и вернуться к вам. Кроме того, консоль DB показывает, что при максимальном использовании 20% отложенных соединений. –

0

Исключение java.net.SocketException: Время ожидания подключения может быть вызвано многими причинами.

Но так как вы упоминаете, что вы сталкиваетесь с ним только несколько раз в течение дня, и он нормально работает нормально, я думаю, что проверка одного из двух пунктов ниже может помочь.

  1. Проверить wait_timeout свойство MySQL. Проверка this link

  2. Проверить max_connections property of mysql. Проверка this link

+0

wait_timeout составляет 28800 секунд, а max_connections - 1000: –

+0

Для max_connections при возникновении проблемы mysql возвращает «Слишком много соединений», а не «Время ожидания подключения», – baraber