开发者社区> 问答> 正文

发生主备数据库切换之后, 在disconnect()里会发生exception

发生主备数据库切换之后, 因为地址发生了变化, 所以在找start position的时候会用timestamp, 从拿到的binlog文件里根据timestamp找对应的position, 这时候会把connection的dumping标致设为true, 在后面reconnect(), disconnect()里面会因为现在是dumping状态, 所以在关掉channel之后会执行一次"KILL CONNECTION", 而这时候用的connection id是之前的已经关闭的, 所以会抛异常.

建议先执行"KILL CONNECTION"再close channel

public void disconnect() throws IOException { if (connected.compareAndSet(true, false)) { try { if (channel != null) { channel.close(); } logger.info("disConnect MysqlConnection to {}...", address); } catch (Exception e) { throw new IOException("disconnect " + this.address + " failure:" + ExceptionUtils.getStackTrace(e)); }

    // 执行一次quit
    if (dumping && connectionId >= 0) {
        MysqlConnector connector = null;
        try {
            connector = this.fork();
            connector.connect();
            MysqlUpdateExecutor executor = new MysqlUpdateExecutor(connector);
            executor.update("KILL CONNECTION " + connectionId);
        } catch (Exception e) {
            throw new IOException("KILL DUMP " + connectionId + " failure:" + ExceptionUtils.getStackTrace(e));
        } finally {
            if (connector != null) {
                connector.disconnect();
            }
        }

        dumping = false;
    }
} else {
    logger.info("the channel {} is not connected", this.address);
}

}

原提问者GitHub用户kinkeylau

展开
收起
绿子直子 2023-05-09 12:00:48 67 0
1 条回答
写回答
取消 提交回答
  • 在新版本里已经修了

    原回答者GitHub用户kinkeylau

    2023-05-10 11:07:31
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
DTCC 2022大会集锦《云原生一站式数据库技术与实践》 立即下载
阿里云瑶池数据库精要2022版 立即下载
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载