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