it-source

org.postgresql.displays.displayPSQLException:FATAL:죄송합니다.이미 클라이언트가 너무 많습니다.

criticalcode 2023. 1. 15. 16:57
반응형

org.postgresql.displays.displayPSQLException:FATAL:죄송합니다.이미 클라이언트가 너무 많습니다.

Postgresql 데이터베이스에 연결하려고 하면 다음 오류가 나타납니다.

오류: org.postgresql.util.PSQLException:FATAL:죄송합니다.이미 클라이언트가 너무 많습니다.

에러의 의미와 수정 방법

나의server.properties파일은 다음과 같습니다.

serverPortData=9042
serverPortCommand=9078
trackConnectionURL=jdbc:postgresql://127.0.0.1:5432/vTrack?user=postgres password=postgres
dst=1
DatabaseName=vTrack
ServerName=127.0.0.1
User=postgres
Password=admin
MaxConnections=90
InitialConnections=80
PoolSize=100
MaxPoolSize=100
KeepAliveTime=100
TrackPoolSize=120
TrackMaxPoolSize=120
TrackKeepAliveTime=100
PortNumber=5432
Logging=1

다음 오류에 대한 설명:

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

Connection을 만드는 모든 클래스에 이 코드를 배치합니다.그러면 클래스가 쓰레기 수집되면 연결이 해제됩니다.

다음 SQL을 실행하여 허용되는 최대 연결 수를 확인합니다.

show max_connections;

기본값은 100 입니다.포스트그레정상적인 하드웨어의 SQL은 한 번에 수백 개의 연결을 지원할 수 있습니다.수천을 할당하려면 연결 풀링 소프트웨어를 사용하여 연결 오버헤드를 줄이는 것이 좋습니다.

누구/무엇/언제/어디서 접속을 개방하고 있는지 확인합니다.

SELECT * FROM pg_stat_activity;

현재 사용되는 연결 수는 다음과 같습니다.

SELECT COUNT(*) from pg_stat_activity;

디버깅 전략

  1. 접속을 해제하지 않을 가능성이 있는 프로그램에 다른 사용자 이름/패스워드를 지정하여 어느 것이 어떤 것인지 확인한 후 pg_stat_activity에서 어떤 것이 그 후에 정리되지 않았는지 확인할 수 있습니다.

  2. 접속을 작성할 수 없었던 경우 완전한 예외 스택트레이스를 실행하고 코드를 따라 새로운 스택을 작성한 곳까지 되돌립니다.Connection접속을 작성하는 모든 코드 행의 끝이connection.close();

max_connections를 높게 설정하는 방법:

postgresql.conf의 max_connections는 데이터베이스 서버에 대한 최대 동시 연결 수를 설정합니다.

  1. 먼저 postgresql.conf 파일을 찾습니다.
  2. 위치를 모를 경우 다음 sql을 사용하여 데이터베이스를 쿼리합니다.SHOW config_file;
  3. 내 것은:/var/lib/pgsql/data/postgresql.conf
  4. 루트로 로그인하여 해당 파일을 편집합니다.
  5. 문자열 "max_connections"를 검색합니다.
  6. 인 you you you you you you you 。max_connections=100.
  7. 이 숫자를 크게 설정하고 postgresql 버전의 제한을 확인합니다.
  8. 변경 내용을 적용하려면 postgresql 데이터베이스를 다시 시작합니다.

최대 max_connections는 몇 개입니까?

다음 쿼리를 사용합니다.

select min_val, max_val from pg_settings where name='max_connections';

8388607이론상으로는 최대 허용량이지만, 폭주 프로세스로 인해 수천 개의 접속이 소비될 수 있습니다.게다가 놀랍게도 데이터베이스를 재부팅할 때까지 응답하지 않습니다.100과 max_connections가 .문제가 되는 프로그램은 새로운 접속이 거부됩니다.

server.properties 파일이 무엇인지도 모르고 SimocoPoolSize가 무엇을 의미하는지도 모릅니다.

데이터베이스 접속의 커스텀수영장을 사용하고 있다고 가정합니다.경우 의 연결을 설정되어 Postgresql 서버는 "" 또는 "120"을 받아들이도록 되어 있는 입니다.MaxConnections=90 인 것 같습니다 이 설정들은 충돌하는 것 같습니다.MaxConnections=120.

그러나 먼저 db 계층 인프라스트럭처를 이해하고 풀에서 열려 있는 연결이 많이 필요한 경우 어떤 풀을 사용하고 있는지 파악해야 합니다.특히 열린 연결을 풀로 정상적으로 되돌리는 경우

Max Connections 및 Initial Connections를 늘릴 필요가 없습니다.일을 마치고 나면 그냥 연결을 끊으세요.예를 들어, 연결을 만드는 경우:

try {
     connection = DriverManager.getConnection(
                    "jdbc:postgresql://127.0.0.1/"+dbname,user,pass);

   } catch (SQLException e) {
    e.printStackTrace();
    return;
}

작업 근접 연결을 수행한 후:

try {
    connection.commit();
    connection.close();
} catch (SQLException e) {
    e.printStackTrace();
}

문제의 행은 다음과 같습니다.

MaxConnections=90
InitialConnections=80

값을 늘려 더 많은 연결을 허용할 수 있습니다.

다음과 같이 모든 연결을 닫아야 합니다.INSERT INTO 문을 작성하는 경우 다음과 같이 문과 연결을 닫아야 합니다.

statement.close();
Connexion.close():

또한 SELECT 문을 작성하는 경우 다음과 같이 문, 연결 및 결과 세트를 닫아야 합니다.

resultset.close();
statement.close();
Connexion.close();

내가 이렇게 했더니 효과가 있었어

언급URL : https://stackoverflow.com/questions/2757549/org-postgresql-util-psqlexception-fatal-sorry-too-many-clients-already

반응형