springboot+mybatis ,数据库事务不提交,数据库 :阿里云polarDB,该如何排查 ?

日志显示对应的新增/更新操作 返回影响行数为1,但实际数据库事务没有提交,监控数据库线程运行情况并没有发生死锁但是事务就是不能提交,对应的thread也一直是sleep状态,如果把对应的会话强行结束,项目直接崩溃,爆出异常,希望帮忙解答

Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.

img

这个问题可能由多个因素造成。我将列举出一些可能导致该问题的原因和可能的解决方案,希望能帮助你解决这个问题。

1.数据库连接问题:阿里云polarDB在某些情况下会导致连接失败,这可能导致事务无法正常提交。您可以检查您的数据库连接设置是否正确。

2.阿里云polarDB连接池配置问题:阿里云polarDB连接池可能被设置为过小,导致资源不足。您可以尝试调整连接池大小来解决这个问题。

3.Mybatis 配置问题:Mybatis 中的配置可能不正确,导致事务无法正常提交。您可以检查看 Mybatis 的配置是否正确,并确保事务管理器正确配置并已启用。

4.网络连接问题:网络连接可能不稳定,导致连接丢失。该错误消息( java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.) 提示了连接被意外丢失了,因此您可能需要检查网络连接是否正常。

5.MySQL服务器问题:服务器的负载可能过高,导致事务无法正常提交。您可以检查服务器的资源使用情况,并确保它们足够。

这些只是可能导致该问题的一些原因。建议您从上面的列表中逐个检查,看看哪个是导致该问题的原因。如果仍然无法解决问题,可以考虑在阿里云的技术支持团队中寻求帮助,他们可能会提供更多有关排查问题的详细信息。

望采纳!!!点击回答右侧采纳即可采纳!
在这种情况下,我建议你可以尝试以下步骤来排查问题:

1.检查数据库连接是否正常。可以使用数据库客户端连接数据库,并执行一些查询语句,看看能否正常执行。

2.检查MyBatis的配置是否正确。可以检查application.properties文件中的数据库连接参数,确保它们都是正确的。

3.检查事务配置是否正确。可以检查你的事务配置,确保你的事务管理器配置正确,并且事务超时时间设置得足够长。

4.检查数据库连接池的配置是否正确。可以检查你的数据库连接池的配置,确保最大连接数和最小连接数设置得合理,并且连接池中的连接能够得到及时释放。

这种情况可能是由于数据库的事务没有正常的提交或者回滚导致的。有可能是由于网络故障或者其他原因导致了事务的提交失败。

要解决这个问题,你可以尝试以下操作:

1.检查数据库服务器的连接状态,确保数据库服务器能够正常连接。

2.检查数据库的日志,看看是否有任何错误信息。

3.检查数据库的事务状态,确保数据库的事务没有被锁定。

4.尝试重新启动数据库服务器,看看是否能够解决问题。

5.如果以上操作都不能解决问题,可以考虑咨询数据库管理员或者技术支

借鉴下
https://blog.51cto.com/u_15127632/2739901

看你的报错像是,链接已经被关闭了,然后执行sql的时候仍然使用的这个链接,导致异常了。
先参考这个博客试试 https://blog.csdn.net/weixin_37934748/article/details/125898682

这个问题很有可能是由于数据库连接超时导致的。阿里云polarDB数据库有一个参数叫做wait_timeout,表示连接空闲多长时间后会被断开。如果Spring Boot应用中的数据库连接在空闲一段时间之后没有被释放,那么它就可能会被断开。这时候就需要调大wait_timeout的值。

可以通过以下步骤来解决这个问题:

确保Spring Boot应用正确地关闭了所有的数据库连接。可以在应用代码中使用try-finally块来保证连接在使用完之后正确地关闭。

如果使用的是Druid数据库连接池,可以调大Druid数据库连接池的minIdle属性。这样可以保证Druid数据库连接池中有足够多的空闲连接,避免连接被断开。

如果使用的是阿里云polarDB数据库,可以调大wait_timeout的值。可以在数据库命令行中执行以下命令来调整wait_timeout的值:

SET GLOBAL wait_timeout=<new_value>;

需要把替换成希望设置的新值。

还有,如果这个问题还是没有解决的话,可以查看应用日志,看看是否有其他的异常信息。假如数据库连接被断开,那么可能会看到类似"java.sql.SQLRecoverableException: No operations allowed after connection closed."这样的异常信息。

此外还可以使用数据库监控工具来查看数据库的连接情况。这样就可以确定数据库的连接是否存在问题。
仅供参考,望采纳,谢谢。

错误分析:
因业务程序本身运行比较慢长或程序异常后没有关闭连接,导致的数据库连接超过了removeAbandonedTimeout规定的时间没有主动关闭,连接池启用自我保护机制把连接关了,当程序再使用这个连接就报错了。
解决方案:
removeAbandoned和removeAbandonedTimeout的设计初衷是为了防止连接泄露的情况发生,所以一定要配置适合业务的时间
配置间隔多久才进行一次检测需要关闭的空闲连接,加大超时时间以及是否自动回收超时连接:


#是否自动回收超时连接
spring.datasource.druid.remove-abandoned=true
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
#超时时间(以秒数为单位)
spring.datasource.druid.remove-abandoned-timeout-millis=1800

首先,你可以在 Spring Boot 应用的日志中查看是否有关于数据库事务的相关信息,例如事务超时、事务异常等。这可能会有助于找出问题的原因。

其次,你可以检查你的 Spring Boot 应用是否正确配置了数据源和事务管理器。如果配置有误,可能会导致事务处理失败。

此外,你还可以检查你的代码中是否存在可能导致事务不提交的情况,例如:

在事务中抛出未捕获的异常。
在事务中使用了 savepoint,并使用了 rollback 回滚到 savepoint。
在事务中使用了不同的事务传播行为,例如使用了 PROPAGATION_REQUIRES_NEW 或 PROPAGATION_NESTED。
最后,你还可以使用数据库的日志功能来获取有关事务的更多信息,这可能会有助于更准确地定位问题。

希望这些建议能帮助你解决问题。

建议你尝试下加大超时时间以及是否自动回收的超时连接数,具体配置如下:

#是否自动回收超时连接
spring.datasource.druid.remove-abandoned=true
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=90000
#超时时间(以秒数为单位)
spring.datasource.druid.remove-abandoned-timeout-millis=2400

希望能帮到你。

首先你需要查看polarDB数据库是否有开启事务隔离级别, 并且确认你的应用程序连接数据库设置的隔离级别是否和数据库相同.

然后, 可以考虑在spring boot配置文件中开启数据库调试日志, 这样可以在日志中看到数据库的调用情况,如连接数量,事务状态,并且能够查看数据库执行的sql语句,来判断事务是否正确开启。

另外,可以在数据库中监控连接信息来确认线程池使用状况,以及数据库中是否存在大量的锁定等待事件.

最后,在你的应用程序崩溃之后,也可以查看应用程序的日志,来寻找异常的原因。其中,EOFException 异常表明应用程序与数据库之间的连接已经断开。此时需要检查网络连接是否正常, 数据库服务器是否正常, 数据库连接配置是否正确.

希望这些提示可以帮助你解决问题,如果你还有什么其他问题请随时继续问.

日志调DEBUG ,查看日志是否开始事务,如果没有事务,可能是spring 事务没开启,检查下@Transaction标注打了没

1.如果项目是多数据源操作,如果是一个service中,同时使用了多数据源操作,此时可能会导致事务不生效,可以试试使用事务管理器