The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

昨天晚上开发时遇到了一个错误,突然出现的,之前好好的

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

我当时是用调试模式启动了项目,就出现了这种问题,最后发现可能我不小心给service接口上的方法加上了方法断点,导致它出现了这种问题。

注意:不要给 方法上带着断点去启动项目,这会拖延你的项目启动时间!!!

至于为什么拖延时间,我浏览了一些资料发现方法断点是通过使用 JDPA 的 Method Entry & Method Exit 特性实现的。
这个实现,要求 JVM,每次,在任何(any)线程进入任何(any)方法时,以及在任何(any)线程退出任何(any)方法时触发事件。

当启用了method entry和method exit:

1. IDE将断点添加到内部方法断点LIST中

2.IDE告诉调试器开启methodentry和method exit事件

3.调试器通过代理将请求传递给VM

4.在每个method entry和method exit事件中,通过整个链将通知转发到IDE

5.IDE检查其方法断点LIST是否包含当前的整个方法

6.如果发现包含,就表示整个方法上有方法断点,则IDE将向VM发送SetBreakpoint请求,打上断点。否则vm的线程将被释放,不会发生任何事情。

总的来说:

方法断点不是JPDA的特性而是ide的特性,方法断点极大的影响调试程序,所以只有真正需要需要使用它们才使用,如果必须使用方法作为断点的话可以考虑关闭 method exit事件。

在方法断点上右键可以看到这个界面,其中就有method exit和method entry

 

posted @ 2023-03-18 10:29  LiusCraft  阅读(343)  评论(0编辑  收藏  举报