> 文章列表 > Java访问PG后台代码执行流程

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

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

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