2012-10-04 74 views
1

我正在調查PostgreSQL中的連接泄漏並希望收集一些診斷信息。在PostgreSQL中診斷應用程序連接泄漏

特別是,我想將一些信息與我所做的每個連接關聯起來,然後能夠直接對其進行查詢。

如果我在MS-SQL中設計這種事情,我會更改我的連接工廠,以便在每次連接後執行一個針對診斷表的upsert,包含@@spid,backtrace和其他診斷信息。

然後爲了診斷髮生了什麼,我可以查詢sysprocesses加入我的spid診斷表。這會給我清潔應用程序與每個連接關聯的回溯。

我如何在PostgreSQL上實現類似的功能?

回答

3

PostgreSQL分叉一個新的進程來處理每個連接。你可以得到這個過程很容易的PID:

SELECT pg_backend_pid(); 

這相當於進程ID在標準管理工具可看到(topps等)。您也可以使用標準工具(kill)終止連接,或者使用適當的權限說SELECT pg_terminate_backend(pid)

當前會話的名單也可在數據庫訪問:

SELECT * FROM pg_stat_activity; 

最後一點:PID的保證是爲運行查詢的時間唯一的,但將被重新使用的操作系統最終。您可以通過將PID與的pg_stat_activity列進行配對來確保唯一性。對於這個問題,你可能會把你的日誌記錄下來:

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();