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;
디버깅 전략
접속을 해제하지 않을 가능성이 있는 프로그램에 다른 사용자 이름/패스워드를 지정하여 어느 것이 어떤 것인지 확인한 후 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"를 검색합니다.
- 인 you you you you you you you 。
max_connections=100
. - 이 숫자를 크게 설정하고 postgresql 버전의 제한을 확인합니다.
- 변경 내용을 적용하려면 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
'it-source' 카테고리의 다른 글
Maria와 함께 Magento 2.1 설치DB (0) | 2023.01.15 |
---|---|
Maria DB 버전 10.1.18에서 JSON_EXTRACT를 사용하는 방법 (0) | 2023.01.15 |
라라벨 오더 반응 속도를 크게 늦춤으로써 (0) | 2023.01.15 |
테이블 관계를 설정하기 위해 "Cascade", "Set Null" 및 "Restrict"는 무엇을 합니까? (0) | 2023.01.15 |
Java 8: Java.util.function의 TriFunction(및 kin)은 어디에 있습니까?아니면 대체방법이 뭐죠? (0) | 2023.01.15 |