开发者社区> 问答> 正文

mysql长时间没数据,可能导致canal与mysql的连接读操作永远阻塞

canal从mysql读binlog事件时,建的连接设置了读超时时间: channel.socket().setSoTimeout(this.soTimeout); ,soTimeout用了30s。

读binlog事件时,用了SocketChannel.read(buffer)方法,soTimeout对这个SocketChannel的read方法无效,永远不会超时,参考http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4614802。

如果mysql有一段时间没数据(比如一个小时),这个连接失效了(可能因为防火墙问题,参考http://www.tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html的2.4. 虽然设置了channel.socket().setKeepAlive(true),但是linux系统默认的keepalive配置时间太长、不起作用。),但canal还在永远阻塞read。

所以是不是用sock.socket().getInputStream()这个来read比较好,如果在soTimeout内没读到数据,就超时了,强制重新建立连接。

原提问者GitHub用户chelubaiq

展开
收起
绿子直子 2023-05-09 15:55:37 135 0
1 条回答
写回答
取消 提交回答
  • 目前设计时依赖于MySQL数据库的空闲链接超时机制,默认是8小时会断开链接,你的链接失效是指半开链接么?这个客户端能获取到EOFException

    原回答者GitHub用户agapple

    2023-05-10 10:52:27
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载
阿里云企业级自治数据库 RDS 详解 立即下载
阿里云MySQL云数据库产品体系介绍 立即下载

相关镜像