在PostgreSQL中诊断应用程序连接泄漏
我正在调查PostgreSQL中的连接泄漏,希望收集一些诊断信息 特别是,我希望将一些信息与我建立的每个连接相关联,然后能够直接查询它 如果我在MS-SQL中设计这种类型的东西,我会改变我的连接工厂,在每次连接完成后,对一个诊断表执行一个upsert,其中包含一个、回溯和其他诊断信息 然后,为了诊断发生了什么,我可以在spid上查询连接到我的诊断表。这将为我提供与每个连接关联的干净的应用程序回溯在PostgreSQL中诊断应用程序连接泄漏,postgresql,Postgresql,我正在调查PostgreSQL中的连接泄漏,希望收集一些诊断信息 特别是,我希望将一些信息与我建立的每个连接相关联,然后能够直接查询它 如果我在MS-SQL中设计这种类型的东西,我会改变我的连接工厂,在每次连接完成后,对一个诊断表执行一个upsert,其中包含一个、回溯和其他诊断信息 然后,为了诊断发生了什么,我可以在spid上查询连接到我的诊断表。这将为我提供与每个连接关联的干净的应用程序回溯 如何在PostgreSQL上实现类似的功能 PostgreSQL派生一个新进程来处理每个连接。您可以
如何在PostgreSQL上实现类似的功能 PostgreSQL派生一个新进程来处理每个连接。您可以轻松获取此过程的PID:
SELECT pg_backend_pid();
这对应于标准管理工具中可见的流程ID(top
,ps
,等等)。您也可以使用标准工具(kill
)终止连接,或者在具有相应权限的情况下,通过说SELECT pg\u terminate\u backend(pid)
数据库中还可以访问当前会话的列表:
SELECT * FROM pg_stat_activity;
最后一点注意:在运行查询时,PID保证是唯一的,但最终将被操作系统重新使用。通过将PID与pg\u stat\u activity
的backend\u start
列配对,可以确保唯一性。对于这一点,您不妨将其与日志记录结合起来:
INSERT INTO log_table (pid, backend_start, message, backtrace)
SELECT procpid, backend_start, 'my message', 'my backtrace'
FROM pg_stat_activity
WHERE procpid=pg_backend_pid();
PostgreSQL派生一个新进程来处理每个连接。您可以轻松获取此过程的PID:
SELECT pg_backend_pid();
这对应于标准管理工具中可见的流程ID(top
,ps
,等等)。您也可以使用标准工具(kill
)终止连接,或者在具有相应权限的情况下,通过说SELECT pg\u terminate\u backend(pid)
数据库中还可以访问当前会话的列表:
SELECT * FROM pg_stat_activity;
最后一点注意:在运行查询时,PID保证是唯一的,但最终将被操作系统重新使用。通过将PID与pg\u stat\u activity
的backend\u start
列配对,可以确保唯一性。对于这一点,您不妨将其与日志记录结合起来:
INSERT INTO log_table (pid, backend_start, message, backtrace)
SELECT procpid, backend_start, 'my message', 'my backtrace'
FROM pg_stat_activity
WHERE procpid=pg_backend_pid();