Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 217,272 milliseconds ago. The last packet sent successfully to the server was 1 milliseconds ago.
做报表的批处理任务一直运行的好好的,但这几天接连出现了上面的异常,查阅了网上好些资料,大部分都说是由于wait_timeout和interactive_timeout参数设置得比较小导致mysql服务器端关闭了连接引起的。查看了mysql的设置,这两个均设置为180(3分钟),正常情况下,这个设置是没有什么问题的,可以减少数据库服务器的负荷。
当然可以根据网上的设置把这两个参数设置到小时级别,就可以解决这个问题。可是这样,很多无效的连接就长时间的和数据库服务器连接着,大大的增加了服务器的负荷。
换个方向考虑,是什么原因导致该数据库连接空闲了超过180秒的时间?原来是由于这个数据库连接和hive的数据库连接从程序入口开始就已经从连接池里拿了出来,然后先出来hive的查询操作,再执行mysql的操作,由于数据量不断增加,hive的查询时间不断加长,处理时间超过了180秒,导致mysql的连接被服务器断开了,所以就导致了这个问题出现。
正确的做法应该是有需要的时候才从连接池获取连接,而不是一开始就先从连接池获取连接,然后空置,从而引致异常。这样做一来不会引起资源浪费,二来不会导致程序异常。
以此记录,避免以后犯这种低级错误。