直接执行:stmt.executeQuery(select 语句)
执行流程ReadCommand--->message 'Q'----->exec_simple_query--->(PS状态为SELECT)
finish_xact_command&&send_ready_for_query=true--->(PS状态为SELECT)
下一个循环由于send_ready_for_query为true,设置PS状态为idle,并执行
case DestRemoteSimple: if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3)
{
StringInfoData buf;
pq_beginmessage(&buf, 'Z');
pq_sendbyte(&buf, TransactionBlockStatusCode());
pq_endmessage(&buf); }
发送结束标志服'Z'
并执行pg_flush将最后一块内存信息发送给客户端,客户端接到‘Z’后才会返回。
绑定变量
conn.prepareStatement(select语句)
ps.set....
上两行代码都是本地执行,与服务器并没有交互
ps.execute(); 这不才开始与服务器交互
交互流程
ReadCommand ----> message 'P' ----> exec_parse_message---->(PS状态为PARSE)
ReadCommand-----> message 'B' ------> exec_bind_message----->(PS状态为BIND)
ReadCommand------>message 'D'------->exec_describe_******_message->(PS状态为BIND)
ReadCommand------>message 'E'-------->exec_execute_message------->(PS状态为SELECT)
ReadCommand------>message 'S'--------->finish_xact_command&&send_ready_for_query=true--->(PS状态为SELECT)
下一个循环由于send_ready_for_query为true,设置PS状态为idle
并执行
case DestRemoteSimple: if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3)
{
StringInfoData buf;
pq_beginmessage(&buf, 'Z');
pq_sendbyte(&buf, TransactionBlockStatusCode());
pq_endmessage(&buf); }
发送结束标志服'Z'
并执行pg_flush将最后一块内存信息发送给客户端,客户端接到‘Z’后才会返回。