H2数据库研究-TCP服务器(二)
今天回到家已经22点了,虽然有点晚,但是今天还是必须坚持,因为我知道大多数计划都是因为某些特殊情况耽误,就一直放弃了,所以我必须坚持下去,不能找任何理由。
继续研究TCP服务器的内容,Tcp服务器主要跟Server, TcpServer和TcpServerThread这几个类有关系,Tcp服务器的序列图如下所示:
其中Server是管理所有服务器的服务器,接收用户对各种服务器的开启,关闭等操作。TcpServer是H2数据库的Tcp服务器。TcpServerThread是TcpServer在
处理多个连接请求开启的线程。其中TcpServer在处理连接请求时候,又会创建一个org.h2.value.Transfer类的对象。
我觉得org.h2.value.Transfer的设计有些问题。在调用它进行处理的时候,需要进行很多步骤,这样的对外接口不是太简洁,不利用其它类调用使用它的方法。
transfer = new Transfer(null);
transfer.setSocket(socket);
transfer.init();
使用它的方法需要这么多步骤,如果不熟悉API的程序员在使用它的时候就很容易出错,我觉得这个类设计的不是太合理。
Transfer类的构造函数完全可以这么写:
public Transfer(SessionInterface session, Socket socket) {
this.session = session;
init();
}
这样调用的时候直接transfer = new Transfer(socket);,然后就可以直接调用transfer的其它方法。
经过阅读可知道Transfer类中的方法均是对DataInputStream,DataOutputStream两个输入输出流中的方法进行一些必要的封装,并且添加了一些新的方法。
如writeValue和ReadValue是直接读写Value对象的方法。
然后开始读取客户端的连接信息,如数据库版本,数据库名称,用户名,密码等等信息。
再调用Engine engine = Engine.getInstance();得到Engine对象,Engine使用了单例模式,而且是线程安全的。