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’后才会返回。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值