"Тайм-аут соединения" между 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: Тайм-аут соединения может быть по многим причинам.

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

  1. Проверьте свойство wait_timeout mysql. Проверьте эту ссылку

  2. Проверьте свойство max_connections mysql. Проверьте эту ссылку

Другие вопросы по тегам