一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

H2 Database学习笔记一 jdbc与TcpServer的交互

时间:2013-09-27 编辑:简简单单 来源:一聚教程网

本节主要记录TcpServer这块的主要流程,H2 jdbc访问TcpServer。主要流程都在TcpServer。

TcpServer的listen()方法监听新的连接请求,接受到新连接则创建TcpServerThread对象,代表一个连接,它里面的Session、Transfer对象都和它一一对应。

TcpServerThread的process方法是主要的执行方法,一个简单的select请求会和client交互7次

1 SESSION_SET_ID 获取client传过来的session id

2 SESSION_PREPARE_READ_PARAMS 状态创建  Command

session.prepareLocal(sql) 主要工作 sql解析

Parser.parseSelectSimpleFromPart(Select)

->readTableFilter 找到用到的table,根据table创建需要的tableFilter

sql执行前的工作,返回CommandContainer

Select init() prepare()

3 COMMAND_EXECUTE_QUERY状态 调用CommandContainer的query方法,

ResultInterface result = prepared.query(maxrows);运行sql执行计划,得到结果。调到Query.query

Select为例 Select.queryWithoutCache

4 RESULT_CLOSE  释放cache中的结果对象

5 COMMAND_CLOSE 释放comand对象

6 SESSION_PREPARE_READ_PARAMS和 COMMAND_EXECUTE_UPDATE  ROLLBACK回滚当前事务,清空临时表

7 SESSION_CLOSE 关闭session,停止TcpServerThread线程

与H2 JDBC的关系
当客户端通过H2 jdbc与tcpServer建立连接时,服务端跳到SESSION_SET_ID,获取session id

当客户端执行executeQuery时,对应服务端的 SESSION_PREPARE_READ_PARAMS和COMMAND_EXECUTE_QUERY

客户端conn.close()则对应SESSION_CLOSE

同一个conn做后面的executeQuery,会对应到RESULT_CLOSE和COMMAND_CLOSE来释放资源

可以看出从请求建立,query执行,到请求关闭与client有7次交互。如果是重用已有连接,每次query查询也会执行2、3、4、5四个步骤.

每次执行select 命令都会交互两次SESSION_PREPARE_READ_PARAMS和 COMMAND_EXECUTE_UPDATE,感觉比较浪费

 

对象关系
TcpServerThread  —– 1 to 1 —– Transfer、Session

Session  ——-1 to 多 ——– Command  ———1 to 1——– Prepared  ——– 1 to 1——–  Parser

每个客户端连接TcpServerThread对应一个session id

jdbc源码主要看JdbcConnection

热门栏目