版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhouhao88410234/article/details/80476683
一、Mycat的请求报文分析(分析协议)
MySQL的协议版本同样的SQL返回的消息格式不一样的
客户端和Mycat的协议版本是不一样的对应返回消息的格式也是有所区别的,Mycat和Navicat是使用version 4
是在握手的时候Capabilities的CLIENT_PROTOCOL_41的使用的是4这样可以固定Mysql返回消息的格式
二、Mycat的Idle time out 和sql time out(1.5的版本)
现象:前端发生 Communications link 导致前端卡死等待Mycat 的前端连接超时 在server.xml配置
<property name="idleTimeout">300000</property>
<property name="sqlExecuteTimeout">300</property>
<property name="sqlExecuteTimeout">300</property>
默认sql timeout 的超时时间和前端的是一致的或者比前端是一致的
所以需要把sqlExecuteTimeout 改成280秒
进行日志分析
1.发现如果前端连接使用了批量的inset 或者 update 操作会引发mysql发送多个OK导致包乱掉
2.前端如果开启事务执行多个分片的inset 或者 update 操作在不同分片 在Commit的时候连接是不会回滚的
<property name="handleDistributedTransactions">1</property>
这是原因是Mycat对分布式事务处理有问题
NonBlockingSession类中判断是否是分布式
if (initCount > 1) {
checkDistriTransaxAndExecute(rrs, 1, autocommit);
} else {
singleNodeHandler.execute();
}
initcount表示事务中操作了多少分片 会容纳2个不同分片的sql语句就算是分布式事务即使关闭分布式事务的开关
在Commit的时候会判断 NonBlockingSession的 关闭分布式事务开关
case 1:
// rollback();
source.writeErrMessage(ErrorCode.ER_NOT_ALLOWED_COMMAND, "Distributed transaction is disabled!Please rollback!");
source.setTxInterrupt("Distributed transaction is disabled!");
break;
所以前端执行了Commit后端也是不会回滚了seesion一直绑定后端连接,等到sqlExecuteTimeout 超时就断开后端连接
但是前端的idleTimeout一般都是等于sqlExecuteTimeout所以看到的是前端Idle timeout
至于修改的方法已经修改可以咨询我