"Тайм-аут соединения" между Tomcat и Mysql
Ошибка исключения сокета, возникающая, когда Tomcat отправляет запрос в Mysql.
Это происходит около 10 раз в течение всего дня. Так как это происходит редко, это, кажется, ключевой вопрос. Любые входные данные о том, как отлаживать дальше / исправить это?
Подробности настройки Tomcat в Linux; Mysql
Трассировки стека
java.sql.SQLException: Communication link failure: java.net.SocketException, underlying cause: Connection timed out
НАЧИНАЕТСЯ ИСКЛЮЧИТЬ
java.net.SocketException
СООБЩЕНИЕ: Тайм-аут соединения
ТРАССИРОВКИ СТЕКА:
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)
КОНЕЦ ГЛАВНОГО ИСКЛЮЧЕНИЯ
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)
2 ответа
Пожалуйста, убедитесь, что в вашем приложении вы закрываете соединение после использования. Если вы не закрываете соединение, то через некоторое время оно достигнет максимального количества соединений. После этого вы не можете создать соединение. Только после достижения таймаута mysql закроет это соединение (которое вы должны фактически закрыть). После этого вы можете использовать это соединение. Поэтому, пожалуйста, проверьте код закрытия вашего соединения.
Исключение java.net.SocketException: Тайм-аут соединения может быть по многим причинам.
Но так как вы упоминаете, что сталкиваетесь с этим только несколько раз в течение дня, и он работает нормально, я думаю, что проверка одного из двух пунктов ниже может помочь.
Проверьте свойство wait_timeout mysql. Проверьте эту ссылку
Проверьте свойство max_connections mysql. Проверьте эту ссылку