应用端连接MySQL数据库报通信链路故障

  

  Long  Long 前   

  

  这个故事,并没有童话故事里王子和公主幸福的各种浪。那么就随我,揭示故事发生的原因。   

  

  
  

  

  事情的起因:   

  

  某项目的开发同学突然要求我们从28800年代   

  

  应用端测试环境的   

  

  
  

  

  恩。报错很明显。这个问题百度后的解决方案大部分都是要求数据库端更改连接等待超时时间。那么这种解决方法是否可行呢?   

  

  遗憾的是,这是不可行的。   

  

  主要原因还是性能考量.Wait_timeout   

  

  在高并发场景中,由于我们的连接数已经封顶,过长的   

  

  所以为了避免出现这种情况,   

  

  既然不允许更改数据库参数,但是问题还在,那么如何定位问题的真正原因呢?这里我将根据我在处理这个问题时的思路,引导大家掌握基本的排障方法。   

  

  
  

  

  问题定位:   

  

  连接出现问题,那么肯定要涉及到两个主要的部分:数据库和   

  

  1只,是否使用了连接池?如果不是,是否有在代码里显式关闭连接吗?   

  

  2只连接池是否配置了连接自动回收机制(如   

  

  
  

  

  开发同学给出的答案是:   

  

  1只确实使用了连接池(   

  

  2只经过和运维相关同学协调,发现   

  

  
  

  

  解决方案:   

  

  好吧   

  

  Tomcat 1只;   

  

  2只如果上述方法不能解决,那么可以尝试更换   

  

  3只如果更换   

  

  应用端连接MySQL数据库报通信链路失败”>
  </p>
  <p>
  因此,可能是某种机制导致人为断开连接,所以在前两种方法都不能解决的情况下,可以尝试使用
  </p>
  <p>
  <br/>
  </p>
  <p>
  经过一番痛苦的尝试,终于在更换了
  </p>
  <p>
  <br/>
  </p>
  <p>
  后记:
  </p>
  <p>
  这个小故事,我总结了下面几点请大家借鉴:
  </p>
  <p>
  1只,所有你看到的故障只是它在某一时间段的某一表象。那么怎么根据这些表象迅速定位问题呢?除了工作经验的积累外,还要掌握把分散的知识点联系起来的能力。这在处理故障时会大有用处。
  </p>
  <p>
  2只开发人员不要轻易要求
  </p>
  <p>
  能在数据库之前就有解决方案的,就绝对不要放到数据库上做。
  </p>
  <p>
  3只尽可能的多了解自己工作之外的世界。做技术要有刨根问底的精神,多了解些和本职工作无关的,甚至是其他人的本质工作,你会发现你的职业道路会越走越宽
  </p>
  <p>
  <br/>
  </p>
  <p>
  PS
  </p>
  <p>
  MySQL
  </p>
  <p>
  很多人会混淆这两个概念。在每个连接一个线程的传统配置里,连接和线程就是
  </p>
  <p>
  连接池实现在
  </p>
  <p>
  线程池实现在每个连接一个线程中的
  </p>
  <p>
  <img src=应用端连接MySQL数据库报通信链路故障