Java访问PG后台代码执行流程

0
分享 2023-12-28

直接执行: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’后才会返回。
 

0 个评论

要回复文章请先登录注册