J'essaie de me connecter à une base de données Postgresql, l'erreur suivante s'affiche:
Erreur: org.postgresql.util.PSQLException: FATAL: désolé, trop de clients déjà
Que signifie l'erreur et comment puis-je la réparer?
Mon fichier server.properties
est le suivant:
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
Nous ne savons pas ce que server.properties est ce fichier, nous ne savons pas non plus ce que SimocoPoolSize signifie
Supposons que vous utilisez un pool personnalisé de connexions de base de données. Ensuite, je suppose que le problème est que votre pool est configuré pour ouvrir 100 ou 120 connexions, mais que votre serveur Postgresql est configuré pour accepter MaxConnections=90
. Ces paramètres semblent conflictuels. Essayez d'augmenter MaxConnections=120
.
Mais vous devez d’abord comprendre votre infrastructure de couche de base de données, savoir quel pool utilisez-vous, si vous avez réellement besoin de tant de connexions ouvertes dans le pool. Et surtout si vous restituez gracieusement les connexions ouvertes à la piscine
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.
Résumé:
Vous avez ouvert plus que la limite autorisée de connexions à la base de données. Vous avez exécuté quelque chose comme ceci: Connection conn = myconn.Open();
à l'intérieur d'une boucle et vous avez oublié d'exécuter conn.close();
. Le fait que votre classe soit détruite et que les ordures collectées ne libèrent pas la connexion à la base de données. La solution la plus rapide consiste à s'assurer que vous avez le code suivant avec la classe qui crée une connexion:
protected void finalize() throws Throwable
{
try { your_connection.close(); }
catch (SQLException e) {
e.printStackTrace();
}
super.finalize();
}
Placez ce code dans n'importe quelle classe où vous créez une connexion. Ensuite, lorsque votre classe sera nettoyée, votre connexion sera libérée.
Exécutez ce SQL pour voir les connexions postgresql max autorisées:
show max_connections;
La valeur par défaut est 100. PostgreSQL sur un bon matériel peut prendre en charge plusieurs centaines de connexions à la fois. Si vous souhaitez en avoir des milliers, vous devriez envisager d'utiliser un logiciel de regroupement de connexions afin de réduire le temps système nécessaire à la connexion.
Jetez un coup d'oeil à qui/quoi/quand/où tient en place vos relations:
SELECT * FROM pg_stat_activity;
Le nombre de connexions actuellement utilisées est:
SELECT COUNT(*) from pg_stat_activity;
Stratégie de débogage
Vous pouvez donner différents noms d'utilisateur/mots de passe aux programmes qui ne libèrent peut-être pas les connexions pour trouver lequel, et ensuite regarder dans pg_stat_activity pour trouver celui qui ne nettoie pas après lui-même.
Effectuez une trace de pile d'exception complète lorsque les connexions ne peuvent pas être créées et suivez le code jusqu'à l'endroit où vous créez une nouvelle variable Connection
; assurez-vous que chaque ligne de code où vous créez une connexion se termine par un connection.close();
Comment définir le nombre maximal de connexions:
max_connections dans le fichier postgresql.conf définit le nombre maximal de connexions simultanées au serveur de base de données.
SHOW config_file;
/var/lib/pgsql/data/postgresql.conf
max_connections=100
.Quelle est la max_connections maximum?
Utilisez cette requête:
select min_val, max_val from pg_settings where name='max_connections';
J'obtiens la valeur 8388607
; en théorie, c'est tout ce que vous êtes autorisé à avoir, mais un processus en cours peut prendre des milliers de connexions et, surprise, votre base de données ne répond pas jusqu'au redémarrage. Si vous aviez un max_connections raisonnable tel que 100. Une nouvelle connexion serait refusée au programme en cause.
Pas besoin d'augmenter les connexions MaxConnections & InitialConnections. Fermez vos liens après avoir terminé votre travail. Par exemple, si vous créez une connexion:
try {
connection = DriverManager.getConnection(
"jdbc:postgresql://127.0.0.1/"+dbname,user,pass);
} catch (SQLException e) {
e.printStackTrace();
return;
}
Après avoir terminé votre travail, établissez une connexion étroite:
try {
connection.commit();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
Vous devez fermer toutes vos connexions, par exemple: Si vous faites une déclaration INSERT INTO, vous devez fermer la déclaration et votre connexion de la manière suivante:
statement.close();
Connexion.close():
Et si vous faites une instruction SELECT, vous devez fermer l’instruction, la connexion et l’ensemble de résultats de la manière suivante:
resultset.close();
statement.close();
Connexion.close();
Je l'ai fait et ça a marché
Les lignes incriminées sont les suivantes:
MaxConnections=90
InitialConnections=80
Vous pouvez augmenter les valeurs pour autoriser plus de connexions.