引入
CopyManager主要用于远程执行数据库的copy命令,主要分为In和Out两方面。
从 public long copyOut(final String sql, Writer to) 方法开始:
解析
流程
新建一个copyOut,不断读取后端传过来的数据,写到Writer流里。
内部实现
cp = copyOut(sql);
关注一下CopyOperation op = queryExecutor.startCopy(sql, connection.getAutoCommit())的实现:
忽略有关事务的判断部分,关注功能实现:
'Q':Identifies the message as a simple query.
由发送的消息格式可以看出,这部分将该sql以简单查询的格式发出了。
向下看一下:processCopyResults(null, true)部分,该方法在上一篇记录里看过,此部分正常应该进入该判断逻辑中:
与上一篇记录的逻辑一致,剩余的消息在初始化方法中接收,最终执行效果和上篇记录相似:
buf = cp.readFromCopy()
该部分最终的功能执行代码为:
'd':Identifies the message as data.COPY,前后端都可以使用该功能
而op.handleCopydata(buf);将该数据放入了op的属性里,该属性:
cp.cancelCopy();
同上篇
总结
同上篇逻辑类似,未细说逻辑