设为首页 加入收藏

TOP

分布式数据库中间件?(3)Cobar对简单select命令的处理过程(三)
2014-11-24 00:04:34 来源: 作者: 【 】 浏览:35
Tags:分布式 数据库 中间件 Cobar 简单 select 命令 处理 过程
26 break;
27 default: // HEADER|FIELDS|FIELD_EOF|ROWS|LAST_EOF
28 final MySQLChannel mc = (MySQLChannel) c;
29 if (fieldEOF) {
30 for (;;) {
31 bin = mc.receive();
32 switch (bin.data[0]) {
33 case ErrorPacket.FIELD_COUNT:
34 c.setRunning(false);
35 handleFailure(ss, rrn, new BinaryErrInfo(mc, bin, sc, rrn));
36 return;
37 case EOFPacket.FIELD_COUNT:
38 handleRowData(rrn, c, ss);
39 return;
40 default:
41 continue;
42 }
43 }
44 } else {
45 bin.packetId = ++packetId;// HEADER
46 List headerList = new LinkedList();
47 headerList.add(bin);
48 for (;;) {
49 bin = mc.receive();
50 switch (bin.data[0]) {
51 case ErrorPacket.FIELD_COUNT:
52 c.setRunning(false);
53 handleFailure(ss, rrn, new BinaryErrInfo(mc, bin, sc, rrn));
54 return;
55 case EOFPacket.FIELD_COUNT:
56 bin.packetId = ++packetId;// FIELD_EOF
57 for (MySQLPacket packet : headerList) {
58 buffer = packet.write(buffer, sc);
59 }
60 headerList = null;
61 buffer = bin.write(buffer, sc);
62 fieldEOF = true;
63 handleRowData(rrn, c, ss);
64 return;
65 default:
66 bin.packetId = ++packetId;// FIELDS
67 switch (flag) {
68 case RouteResultset.REWRITE_FIELD:
69 StringBuilder fieldName = new StringBuilder();
70 fieldName.append("Tables_in_").append(ss.getSource().getSchema());
71 FieldPacket field = PacketUtil.getField(bin, fieldName.toString());
72 headerList.add(field);
73 break;
74 default:
75 headerList.add(bin);
76 }
77 }
78 }
79 }
80 }
81 } finally {
82 lock.unlock();
83 }
84 }//异常处理....................
85 }

这里真正的执行SQL语句,然后等待后端执行语句的返回数据,在成功获取后端Mysql返回的结果后,该函数返回的数据包是结果集数据包。

当客户端发起认证请求或命令请求后,服务器会返回相应的执行结果给客户端。客户端在收到响应报文后,需要首先检查第1个字节的值,来区分响应报文的类型。

响应报文类型 第1个字节取值范围
OK 响应报文 0×00
Error 响应报文 0xFF
Result Set 报文 0×01 – 0xFA
Field 报文 0×01 – 0xFA
Row Data 报文 0×01 – 0xFA
EOF 报文 0xFE

注:响应报文的第1个字节在不同类型中含义不同,比如在OK报文中,该字节并没有实际意义,值恒为0×00;而在Result Set报文中,该字节又是长度编码的二进制数据结构(Length Coded Binary)中的第1字节。

Result Set 消息分为五部分,结构如下:

结构 说明
[Result Set Header] 列数量
[Field] 列信息(多个)
[EOF] 列结束
[Row Data] 行数据(多个)
[EOF] 数据结束

函数执行完成后,返回的结果都放入LinkedList中,当读取结果完成后放入多节点执行器的缓冲区。如果buffer满了,就通过前端连接写出给客户端。

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇MongoDB中shard key的选择 下一篇海量数据检索的一些思考

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: