開發同事在自己的windos電腦搭建了PostgreSQL,但是應用程序連接數據庫,出現“數據庫的連接太多了**”。由於未設置詳細的log內容;只獲取到這個信息。
先查看實例的max_connections;
show max_connections;
select name, setting, context, source from pg_settings where name = 'max_connections'
結果是:500
查看實例的連接數
--獲取當前實例的總的連接數
select count(1) from pg_stat_activity ;
--獲取當前實例的空閑連接數
select count(1) from pg_stat_activity where state = 'idle';
結果是:
- 總的連接數:107
- 空閑的連接數:101
因為應用程序連接是使用jdbc的連接池;需要提前申請連接資源。但問題是連接數遠遠少於500。
驗證下參數是否生效
在9.5以后的版本;可以采用
select * from pg_file_settings where error is not null;
若沒有記錄;則表明沒有失效的參數
通過任務管理器查看內存使用情況
內存使用率不過20%;可以排除不是申請連接時內存不夠
查看數據庫的連接數是否限制
通過pg_databases可以查看
select datname,datconnlimit from pg_database;
查看結果;問題出在這;開發在創建數據庫加了CONNECTION LIMIT = 100;
解決方法:
ALTER DATABASE ** CONNECTION LIMIT 300;
擴展:
- 當然也可以要求開發申請連接資源降低,也可以緩解。
- 通過結束 idle 會話治不了根本。kill掉之后會繼續申請。
SELECT pg_terminate_backend(pid) FROM pg_stat_activity where state = 'idle';