다음 오류에 대한 설명 :
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.
요약:
허용 된 데이터베이스 연결 제한을 초과하여 열었습니다. 다음과 같이 Connection conn = myconn.Open();
실행했습니다 conn.close();
. 루프 내부에서 실행하는 것을 잊었습니다 . 클래스가 파괴되고 가비지 수집이 데이터베이스에 대한 연결을 해제하지 않습니다. 이에 대한 가장 빠른 수정은 연결을 생성하는 클래스에 대해 다음 코드가 있는지 확인하는 것입니다.
protected void finalize() throws Throwable
{
try { your_connection.close(); }
catch (SQLException e) {
e.printStackTrace();
}
super.finalize();
}
연결을 만드는 모든 클래스에 해당 코드를 배치합니다. 그런 다음 클래스가 가비지 수집되면 연결이 해제됩니다.
이 SQL을 실행하여 허용 된 postgresql 최대 연결을 확인합니다.
show max_connections;
기본값은 100입니다. 양호한 하드웨어의 PostgreSQL은 한 번에 수백 개의 연결을 지원할 수 있습니다. 수천 개를 원할 경우 연결 풀링 소프트웨어를 사용하여 연결 오버 헤드를 줄이는 것을 고려해야합니다.
누가 / 무엇을 / 언제 / 어디에서 연결을 유지하고 있는지 정확히 살펴보십시오.
SELECT * FROM pg_stat_activity;
현재 사용되는 연결 수는 다음과 같습니다.
SELECT COUNT(*) from pg_stat_activity;
디버깅 전략
연결을 해제하지 않을 수있는 프로그램에 다른 사용자 이름 / 암호를 제공하여 연결을 해제 한 다음 pg_stat_activity에서 어떤 것이 자체적으로 정리되지 않는지 알아낼 수 있습니다.
연결을 생성 할 수 없을 때 전체 예외 스택 추적을 수행하고 코드를 새로 생성 한 위치까지 다시 따르십시오 Connection
. 연결을 생성하는 모든 코드 라인이connection.close();
max_connections를 더 높게 설정하는 방법 :
postgresql.conf의 max_connections는 데이터베이스 서버에 대한 최대 동시 연결 수를 설정합니다.
- 먼저 postgresql.conf 파일을 찾으십시오.
- 위치를 모르는 경우 sql을 사용하여 데이터베이스를 쿼리합니다.
SHOW config_file;
- 내 위치 :
/var/lib/pgsql/data/postgresql.conf
- 루트로 로그인하고 해당 파일을 편집하십시오.
- 문자열 "max_connections"를 검색합니다.
- 라는 줄이 표시
max_connections=100
됩니다.
- 그 숫자를 더 크게 설정하고 postgresql 버전의 제한을 확인하십시오.
- 변경 사항을 적용하려면 postgresql 데이터베이스를 다시 시작하십시오.
최대 최대 연결 수는 얼마입니까?
이 쿼리를 사용하십시오.
select min_val, max_val from pg_settings where name='max_connections';
8388607
이론 상으로는 허용되는 최대 값인 값을 얻었 지만, 런 어웨이 프로세스는 수천 개의 연결을 소모 할 수 있으며 놀랍게도 데이터베이스는 재부팅 할 때까지 응답하지 않습니다. 만약 당신이 100과 같은 합리적인 max_connections를 가지고 있다면. 문제가되는 프로그램은 새로운 연결이 거부 될 것입니다.