Une explication de l'erreur suivante :
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 j'ai oublié d'exécuter conn.close();
. Ce n'est pas parce que votre classe est détruite et que les déchets sont récupérés que la connexion à la base de données est libérée. La solution la plus rapide consiste à vous assurer que vous disposez du 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 ramassé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 quelques centaines de connexions à la fois. Si vous voulez en avoir des milliers, vous devriez envisager d'utiliser un logiciel de regroupement de connexions pour réduire la surcharge de connexion.
Regardez exactement qui/quoi/quand/où maintient vos connexions :
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 pourraient ne pas libérer les connexions pour savoir lequel il s'agit, puis regarder dans pg_stat_activity pour savoir lequel ne se nettoie pas après lui-même.
-
Effectuez une trace complète de la pile d'exceptions lorsque les connexions n'ont pas pu être créées et suivez le code jusqu'à l'endroit où vous créez une nouvelle
Connection
, assurez-vous que chaque ligne de code où vous créez une connexion se termine par unconnection.close();
Comment augmenter le nombre max_connections :
max_connections dans postgresql.conf définit le nombre maximum de connexions simultanées au serveur de base de données.
- Trouvez d'abord votre fichier postgresql.conf
- Si vous ne savez pas où il se trouve, interrogez la base de données avec le sql :
SHOW config_file;
- Le mien est dans :
/var/lib/pgsql/data/postgresql.conf
- Connectez-vous en tant que root et modifiez ce fichier.
- Recherchez la chaîne :"max_connections".
- Vous verrez une ligne indiquant
max_connections=100
. - Définissez ce nombre plus grand, vérifiez la limite de votre version de postgresql.
- Redémarrez la base de données postgresql pour que les modifications prennent effet.
Quel est le maximum de max_connections ?
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 le maximum que vous êtes autorisé à avoir, mais un processus incontrôlable peut consommer 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 comme 100. Le programme incriminé se verrait refuser une nouvelle connexion.