发生主备数据库切换之后, 因为地址发生了变化, 所以在找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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。