2011-03-01 30 views
1

我們在使用PostgreSQL 8.0.9作爲數據庫的JBoss中運行Java EE Web應用程序。掛載PostgreSQL進程

應用程序中的一個頁面在加載時會運行一個大而複雜的查詢。如果用戶在請求的頁面返回給客戶端之前請求了此頁面並關閉了瀏覽器窗口,我們遇到了一個問題。問題是關閉窗口會產生一個新的PostgreSQL線程/進程(通過頂部可見),並且新的線程/進程需要很長時間才能從頂部輸出中的SELECT切換到空閒狀態。如果大約5個或更多的用戶在一小段時間內完成了這個操作(在瀏覽器窗口關閉之前,大型複雜查詢頁面返回給客戶端),生成的線程/進程正在增長並且不會切換到空閒狀態(停留在SELECT中)很多CPU,造成重大性能問題。需要提到的是,如果關閉瀏覽器窗口的用戶註銷,相關的線程/進程將切換到空閒狀態,並且CPU使用率將下降。還有一點很重要,就是如果JBoss重啓,適用的線程/進程會切換到空閒狀態(因爲所有的用戶都會在重啓後退出)。

懸掛線程/進程的問題似乎已通過數據庫備份和RESTORE解決。現在,產生的新線程/進程在通常很短的時間內就從SELECT切換到空閒狀態,並且CPU不會承受太多的負擔。此外,自RESTORE以來,大型複雜查詢的性能似乎有了顯着提高。

我們每24小時在數據庫上運行VACUUM。由於數據損壞風險,我們不在數據庫上運行REINDEX。我們確實傾向於在iostat輸出上有相當高的等待數量,特別是在上述性能問題情況下。

數據庫在轉儲和恢復時會發生什麼(例如REINDEX等)?這些似乎是我們解決方案的關鍵之一?

是否有一個設置來管理在瀏覽器窗口關閉之前生成的線程/進程的數量,然後將具有大型複雜查詢的頁面返回給客戶端?是否有一個設置來管理從SELECT到idle這樣的線程/進程的轉換?有沒有在應用程序級別管理其中的任何一個?

回答

2

版本8.0已經是EOL,並且版本8.0.9還沒有被修補很長時間:8.0.26已經是最後一次了。您缺少許多修補程序,應該至少更新到最新的8.0版本,還要開始遷移到仍支持的版本。從版本8.2和8.3開始,性能變得更好。

問題:您爲什麼認爲REINDEX會破壞您的數據?數據腐敗會使這種說法變得毫無用處...... REINDEX不是你每天都會做的事情,但有時你需要它。

+0

弗蘭克,謝謝你的回覆。我們的目標是到達另一個版本的PostgreSQL,但我們還沒有。我們正試圖找出我們現在可以做的事情,而我們正在爲新的PostgreSQL版本準備應用程序。至於REINDEX,我們在運行REINDEX的用戶中發現了很多PostgreSQL論壇和其他地方的帖子,並且出現了一些問題。也許這些人沒有正確運行REINDEX並且數據被破壞了。 – Chuck 2011-03-02 15:46:06

+0

對版本8.0.26的更新不是什麼大問題,只需使用pg_ctl進行安裝並重新啓動即可。而已。你以前做過備份,但這很正常。升級到最新的8.2版本也不是一個巨大的項目,8.3和更高版本可能會因爲變化而產生更大的影響。檢查發行說明以查看修補程序是否解決了掛起問題。 – 2011-03-02 15:59:16