当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Liquibase:通信链路故障

孟均
2023-03-14

我在所有项目中都使用Liquibase,我非常喜欢它处理db更新的方式,但最近我遇到了这个问题:

liquibase                                : Successfully acquired change log lock
liquibase                                : Successfully released change log lock
liquibase                                : Could not release lock

liquibase.exception.LockException: liquibase.exception.DatabaseException: liquibase.exception.DatabaseException: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.
    at liquibase.lockservice.StandardLockService.releaseLock(StandardLockService.java:283) ~[liquibase-core-3.5.5.jar!/:na]
    at liquibase.Liquibase.update(Liquibase.java:218) [liquibase-core-3.5.5.jar!/:na]
    at liquibase.Liquibase.update(Liquibase.java:192) [liquibase-core-3.5.5.jar!/:na]
.
.
.
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.
.
.
liquibase                                : Failed to restore the auto commit to true
.
.
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 16,913 milliseconds ago.  The last packet sent successfully to the server was 89 milliseconds ago.
.
.
Caused by: java.lang.NullPointerException: null
    at com.mysql.jdbc.MysqlIO.clearInputStream(MysqlIO.java:899) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2477) ~[mysql-connector-java-5.1.46.jar!/:5.1.46]

我的服务器上运行了3个应用程序。其中一个跑了大约20年。第二次运行2个月,第三次是新的。

它们都是Spring Boot应用程序。

当我想更新第二个应用的jar时,我停止了旧的jar,运行了新的jar,但我无法让它以上面的错误开始。然后我运行了同一个应用程序的旧罐子,它一开始就很好。我试着停止并重新启动这个旧罐子,有几次我发现上面的错误,但大多数时候它启动得很好。

我尝试重新启动服务器(这三个应用程序都是在系统启动时作为服务启动的),但由于相同的错误,它们都没有成功启动。甚至连一个连续两年的都没有。我停止所有其他应用程序,然后用这个持久的应用程序再试一次,它一直失败,直到启动。

可能是记忆问题吗?我用的是一个DigitalOcean droplet,有1个内核和2gb内存。

此外,我注意到,当它成功启动日志时,如下所示:

liquibase                                : Successfully acquired change log lock
liquibase                                : Reading from myDataBase.DATABASECHANGELOG
liquibase                                : Successfully released change log lock

注意锁的获取和释放之间的声明。我还怀疑在获取锁和读取变更日志之间存在时间问题。但我不知道我是否可以增加时间,或者我如何才能做到。

我不知道问题的来源,但是在将liquibase-core更新到v3.7.0后,所有应用程序都正确启动了

关于之前的更新,我测试的不是问题解决了,只是不太频繁。但它已经发生了

经过一番挖掘,我意识到,在发生这种情况的同时,团队正在使用DB连接池。应用程序。属性文件包含以下内容:

spring.datasource.tomcat.initial-size=5
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=5
spring.datasource.tomcat.max-idle=5
spring.datasource.tomcat.min-idle=5
spring.datasource.tomcat.default-auto-commit=true

可悲的是,我对数据库池了解不多。但是引起我注意的是关于自动提交的最后一行。最后一次弹出此错误。我禁用所有这些行和应用程序开始罚款。我不知道这是否只是巧合。

非常感谢你!

我又回到原点了...我不知道如何解决这个问题,任何线索都会受到赞赏

我将mysql连接器java更新为v8。0.15. 我的服务器有MySQL v5。6.33. 我仍然有这个问题,现在我无法重新启动我的应用程序。

在进行上述更改后,现在异常以以下内容结束:

The last packet successfully received from the server was 10,036 milliseconds ago.  The last packet sent successfully to the server was 10,036 milliseconds ago.
.
.
.
Caused by: java.io.IOException: Socket is closed
    at com.mysql.cj.protocol.AbstractSocketConnection.getMysqlInput(AbstractSocketConnection.java:72) ~[mysql-connector-java-8.0.15.jar!/:8.0.15]
    at com.mysql.cj.protocol.a.NativeProtocol.clearInputStream(NativeProtocol.java:833) ~[mysql-connector-java-8.0.15.jar!/:8.0.15]
    ... 92 common frames omitted

为了明确起见,我决定通过设置liquibase从我的项目中禁用liquibase。在应用程序中,enabled=false。属性。现在我可以随时启动/停止/重新启动应用程序,没有问题。由于我只使用liquibase来保存数据库,并且我所做的更改都会被执行(问题是在释放锁时),所以我将启用liquibase来更新模式,然后禁用它来运行应用程序

我一次又一次地停止和启动应用程序,每次我都会发现插座关闭了,所以我开始思考一个时间问题。。。从抛出的异常中,我注意到,每当它说:

从服务器成功接收的最后一个数据包是xxxx毫秒前。

我在几毫秒前得到的最小值是10.085,碰巧我有同一个应用程序的一些日志,从很久以前就没有出现过这个问题。从这些日志语句中,我测量了获取更改日志锁和释放它之间的时间。令我惊讶的是,这大约是9秒,而且从来没有超过这一秒。

所以我登录到mysql控制台并发出:

show variables LIKE '%timeout%';

这给了我一个确定的超时列表。在那里,connect_timeout是最小的,设置为10秒。一定是这样。

我在谷歌上搜索如何设置该值。我试图创建一个文件/etc/my。cnf并添加:

[mysqld]
connect_timeout=20

然后重启mysql:

sudo /etc/init.d/mysql restart

但是当我登录到mysql控制台时,值仍然是10。所以在mysql控制台我发出了另一个命令:

SET GLOBAL connect_timeout=20;

该值已更新(我不知道重启后是否会持续)

我重新启动mysql,然后。。。瞧!现在,这些应用程序通常在启用liquibase的情况下启动。我很高兴!:-)


共有3个答案

夏和雅
2023-03-14

你解决了吗?

我遇到了一个类似的问题,并通过强制Liquibase以同步模式执行来解决它。你的spring boot应用是由jhipster开发的吗?如果是这样,请查看数据库配置,并从AsyncSpringLiquibase更改为SpringLiquibase

怀德馨
2023-03-14

我们正在使用MySQL 8.0.19。对我来说,这只是一个查询,用于失败的异常导致:java.io.IOExcue:套接字关闭

发现对于MySQL 8.0.19,有一个错误报告与类似的堆栈跟踪mine-https://bugs.mysql.com/bug.php?id=99234

在将MySQL服务器升级到8.0.21之后,它开始工作了!没有其他变化。

希望这对那些花了相当长时间处理选定查询(ies)不起作用且有相同错误,并尝试了各种其他选项的人有所帮助。

燕靖
2023-03-14

我一次又一次地停止和启动应用程序,每次我都会发现插座关闭了,所以我开始思考一个时间问题。。。从抛出的异常中,我注意到,每当它说:

从服务器成功接收的最后一个数据包是xxxx毫秒前。

我在几毫秒前得到的最小值是10.085,碰巧我有同一个应用程序的一些日志,从很久以前就没有出现过这个问题。从这些日志语句中,我测量了获取更改日志锁和释放它之间的时间。令我惊讶的是,这大约是9秒,而且从来没有超过这一秒。

所以我登录mysql控制台并发布:

show variables LIKE '%timeout%';

这给了我一个定义超时的列表。就在那里connect_timeout是最小的,设置为10秒。一定是它。

我在谷歌上搜索如何设置该值。我尝试创建一个文件/etc/my。cnf及其补充:

[mysqld]
connect_timeout=20

然后重启mysql:

sudo /etc/init.d/mysql restart

但是当我登录到mysql控制台时,值仍然是10。所以在mysql控制台我发出了另一个命令:

SET GLOBAL connect_timeout=20;

并且该值已更新(我不知道在服务器完全重启后这种情况是否会持续)

我重新启动mysql,然后。。。瞧!现在,这些应用程序通常在启用liquibase的情况下启动。我很高兴!:-)

 类似资料:
  • 我用java从MySQL查询了一些记录。但是在一些查询中,我遇到了一个问题,使查询失败,但在其他情况下,它查询成功。错误消息是下一个: 我尝试过一些方法,比如: 在 但什么都没发生。 我的环境是: MySQL: 5.5.3-m3-log源代码分布 Java: 1.60_16 jdk: HotSpot(TM)64位服务器VM(构建14.2-b01,混合模式) JDBC: mysql连接器-java-

  • 我在Stackoverflow的另一个问题中尝试了这个建议,并在连接方面做了如下更改 但我的项目还是失败了 严重:执行身份验证com时发生异常。mysql。jdbc。例外情况。jdbc4。通信异常:通信链路故障 谁能告诉我克服这个问题的最好方法是什么?

  • StackOverflow上发布的与通信有关的问题似乎已经够多了。但没有一个能帮我走出困境。 但是,当我试图通过JDBC连接DB服务器时,它仍然失败,出现异常“com.mysql.JDBC.exceptions.jdbc4.CommunicationsException:Communications link Failure”。 测试类如下所示。

  • 我试图连接我的java应用程序与SQL数据库和当我点击保存按钮它给我以下错误 这是我的密码

  • 我有一个带有JDBC mysql连接的服务器,但每天早上检查服务器时都会出现这样的错误: 在com.mysql.jdbc.mysqlio.readfly(mysqlio.java:1395)在com.mysql.jdbc.mysqlio.reuseandreadpacket(mysqlio.java:1539)在com.mysql.jdbc.mysqlio.checkerrorpacket(mys

  • 我们正在运行一个带有Spring Hibernate MySql的J2EE应用程序,该应用程序在内部使用C3P0和Connector/J进行连池。 C3P0 C3P0配置 我的应用程序在一段时间后内部调用存储过程,我遇到以下错误 错误日志 现在,当我查看数据库日志时,我发现大多数查询都处于“创建排序索引”状态,如下所示 有人能帮我吗... 编辑 1.c3p0初始化日志