【问题标题】:"Connection timed out" between Tomcat & MysqlTomcat和Mysql之间的“连接超时”
【发布时间】:2015-07-30 06:25:28
【问题描述】:

问题 Tomcat 向 Mysql 发送请求时发生 Socket Exception。

这一天大约会发生 10 次。由于它很少发生,这似乎是一个角落问题。关于如何进一步调试/修复它的任何意见?

设置详情 Linux 上的 Tomcat; mysql

堆栈跟踪

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

开始嵌套异常

java.net.SocketException

MESSAGE:连接超时

堆栈跟踪:

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)

【问题讨论】:

  • 你能至少连接一次mysql吗?我的意思是您是否面临“有时我可以连接,有时我没有问题”??
  • @FathahRehmanP:大多数时候连接都是成功的。这个问题在一整天内发生大约 10 次。非常罕见。
  • @MichaelMassey- 我想我的回答会解决你的问题
  • 使用像 Hikari 这样的连接池来处理你的连接。
  • 嗨@Stefan,Tomcat JDBC 连接池正在用于处理连接。

标签: mysql tomcat socketexception


【解决方案1】:

请确保在您的应用程序中使用后关闭连接。如果您没有关闭连接,那么一段时间后它将达到最大连接数。之后,您无法创建连接。只有在达到超时后,mysql才会关闭该连接(实际上应该关闭)。之后,您可以使用该连接。所以请检查您的连接关闭代码。

【讨论】:

  • 虽然我已经检查了很多次代码,但让我再检查一下并回复您。此外,数据库控制台显示最多使用了 20% 的分配连接。
【解决方案2】:

java.net.SocketException: Connection timed out异常可能有很多原因。

但是由于您提到您在白天只面对它几次并且它正常工作,我认为检查以下两点之一可能会有所帮助。

  1. 检查 mysql 的 wait_timeout 属性。检查this link

  2. 检查 mysql 的 ma​​x_connections 属性。检查this link

【讨论】:

  • wait_timeout 为 28800 秒,max_connections 设置为 1000
  • 对于max_connections,如果有问题mysql返回“Too many connections”,而不是“Connection timed out”
猜你喜欢
  • 2012-04-02
  • 2020-08-20
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 2019-04-20
相关资源
最近更新 更多