【问题标题】:Lose the connection to WildFly after restarting MySQL server重新启动 MySQL 服务器后失去与 WildFly 的连接
【发布时间】:2022-07-07 11:34:06
【问题描述】:

重启 MySQL 后,WildFly 连接丢失。我们使用了 2 个版本的 MySQL,MySQL Ver 14.14 Distrib 5.6.51,用于使用 EditLine wrappe 的 Linux (x86_64) 和 MySQL Ver 8.0.28,用于 x86_64 上的 Linux(MySQL 社区服务器 - GPL)

我们尝试了 Wildfly wildfly-10.1.0.Finalwildfly-19.1.0.Final 的 2 个版本,我们使用了 JDBC,数据库连接器版本是 - 8.0.19

public static Connection getConnection() throws Exception {
        LOG.debug("returning new connection");
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/xxx?allowPublicKeyRetrieval=true&useSSL=false", "xxxx", "xxxx");
        return con;
    }

重启MySQL服务器后如何自动重新连接,最好的方法是什么?

我们收到错误消息

1. 2022-04-08 16:09:36,614 ERROR [xxx.xxx.mysql.MysqlSentSMSDAo] (DefaultQuartzScheduler_Worker-9) No operations allowed after connection closed.: java.sql.SQLNonTransientConnectionException: No operations allowed after connection closed.
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:73)
    at com.mysql.cj.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:1659)
    at com.mysql.cj.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:1575)
    at xxx.xxxx.loader.mysql.MysqlSentSMSDAo.selectReplyRecord(MysqlSentSMSDAo.java:85)
    at xxx.xxx.loader.schedular.UpdateReplyReport.execute(UpdateReplyReport.java:109)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525)
Caused by: com.mysql.cj.exceptions.ConnectionIsClosedException: No operations allowed after connection closed.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
    at com.mysql.cj.NativeSession.checkClosed(NativeSession.java:1171)
    at com.mysql.cj.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:576)
    at com.mysql.cj.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:1590)
    ... 5 more
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

2. The last packet successfully received from the server was 4,742 milliseconds ago. The last packet sent successfully to the server was 4,744 milliseconds ago.
    at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1003)
    at xxx.xxx.loader.mysql.MysqlSentSMSDAo.getListOfSQLSentSMSEntities(MysqlSentSMSDAo.java:39)
    at xxx.xxx.loader.schedular.UpdateBulkReceipts.execute(UpdateBulkReceipts.java:59)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525)
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

【问题讨论】:

  • 这看起来像是 20 多年前的代码。 Wildfly 有一个内置的连接池机制,其中一部分是在连接发出之前验证连接的能力。您是否收到任何关于该问题的异常或日志?
  • @stdunbar,我现在包含了错误消息,你能告诉我吗
  • 这表明连接已经关闭。您的代码非常简单,即使连接不再有效,您也必须保持连接。您可以在使用连接之前致电connection.isClosed()。但是,再一次,你这样做是困难的——使用内置的连接池。您不能重复使用已关闭的连接。你必须买一个新的。

标签: java mysql jboss ejb wildfly


【解决方案1】:

在连接字符串中添加属性autoReconnect=true,使连接自动恢复。如果您使用的是 Wildfly,那么最好在standalone.xml 中定义数据源,在 标记中使用 autoReconnect=true

.

【讨论】:

    猜你喜欢
    • 2015-02-13
    • 2017-09-15
    • 1970-01-01
    • 2015-01-12
    • 2016-04-22
    • 2010-12-25
    • 2020-12-07
    • 2011-03-28
    • 2016-07-23
    相关资源
    最近更新 更多