Mycat源码阅读(三)JDBC和mycat的握手

Connection建立连接,就是tcp的三次握手了,mysql协议中,当连接建立后,mysql数据库则发送HandshakePacket报文,向jdbc提供数据库版本号等信息,jdbc向mysql提供url用户名密码等进行身份认证。
NIOAcceptor创建一个FrontendConnection后,会将FrontendConnection注册到NIOReactor中,

/**
* [简要描述]</br>
 * [详细描述]:当连接建立完毕后,从reactorPool 中获得一个 NIOReactor,然后把连接传递到 NIOReactor,然后后续的 Read  Write 事件就交给NIOReactor 处理了。</br>
 */
private void accept() {
	SocketChannel channel = null;
	try {
		channel = serverChannel.accept();
		channel.configureBlocking(false);
		FrontendConnection c = factory.make(channel);
		c.setAccepted(true);
		c.setId(ID_GENERATOR.getId());
		NIOProcessor processor = (NIOProcessor) IsolationServer.getInstance()
				.nextProcessor();
		c.setProcessor(processor);
		
		NIOReactor reactor = reactorPool.getNextReactor();
		reactor.postRegister(c);

	} catch (Exception e) {
        LOGGER.warn(getName(), e);
		closeChannel(channel);
	}
}

NIOReactor监听channel读事件,并调用AbstractConnection的register方法,FrontendConnection重写了AbstractConnection的register方法,在此方法中,new一个HandshakePacket对象,并把握手报文发送出去。而后监听读事件,等jdbc方面的反馈。

if(useHandshakeV10) {
	HandshakeV10Packet hs = new HandshakeV10Packet();
	hs.packetId = 0;
	hs.protocolVersion = Versions.PROTOCOL_VERSION;
	hs.serverVersion = Versions.SERVER_VERSION;
	hs.threadId = id;
	hs.seed = rand1;
	hs.serverCapabilities = getServerCapabilities();
	hs.serverCharsetIndex = (byte) (charsetIndex & 0xff);
	hs.serverStatus = 2;
	hs.restOfScrambleBuff = rand2;
	hs.write(this);
} else {
	HandshakePacket hs = new HandshakePacket();
	hs.packetId = 0;
	hs.protocolVersion = Versions.PROTOCOL_VERSION;
	hs.serverVersion = Versions.SERVER_VERSION;
	hs.threadId = id;
	hs.seed = rand1;
	hs.serverCapabilities = getServerCapabilities();
	hs.serverCharsetIndex = (byte) (charsetIndex & 0xff);
	hs.serverStatus = 2;
	hs.restOfScrambleBuff = rand2;
	hs.write(this);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值