在 x86_64-pc-linux-gnu 上使用 SystemTap 跟踪 PostgreSQL 11.2 上的 postgres 会话时,由 gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36) 编译,64 位。
global livequeries
probe process("/usr/pgsql-11/bin/postgres").mark("query-start"){
printf("[%s] Query start on PID %d : %s \n", ctime(gettimeofday_s()), pid(), user_string($arg1) )
livequeries[tid(),$arg1] = gettimeofday_us()
}
psql 触发此探测器,但 java 驱动程序不触发。
参考资料:文档
我认为通过 Java 程序运行查询与通过 Java 程序运行查询的区别在于您
psql
使用 Java 中的准备语句。处理“简单语句”和准备好的语句在 Postgres 后端 ( postgres.c ) 中采用不同的代码路径。“query-start”探测器仅在执行简单语句时调用 (
exec_simple_query
),而准备好的语句处理有两个独立的不同阶段:解析 (exec_parse_message
) 和执行 (exec_execute_message
)。两个代码路径在调用 pquery.c 时会收敛
PortalRun
,其中调用了“query-execute”探测器。换句话说,两个代码路径如下所示(省略“完成”探测):
如果您不是特别关心查询解析和计划延迟,则需要捕获“query-execute-*”探测器。如果您需要查询文本,请同时捕获“query-parse-start”。