En förklaring till följande fel:
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.
Sammanfattning:
Du öppnade mer än den tillåtna gränsen för anslutningar till databasen. Du körde ungefär så här:Connection conn = myconn.Open();
inuti en loop, och glömde att köra conn.close();
. Bara för att din klass förstörs och skräp samlas in frigörs inte anslutningen till databasen. Den snabbaste lösningen på detta är att se till att du har följande kod med vilken klass som helst som skapar en anslutning:
protected void finalize() throws Throwable
{
try { your_connection.close(); }
catch (SQLException e) {
e.printStackTrace();
}
super.finalize();
}
Placera den koden i valfri klass där du skapar en anslutning. Sedan när din klass har samlats in, kommer din anslutning att släppas.
Kör denna SQL för att se postgresql max-anslutningar tillåtna:
show max_connections;
Standard är 100. PostgreSQL på bra hårdvara kan stödja några hundra anslutningar åt gången. Om du vill ha tusentals bör du överväga att använda programvara för anslutningspoolning för att minska anslutningskostnaderna.
Ta en titt på exakt vem/vad/när/var som håller dina anslutningar öppna:
SELECT * FROM pg_stat_activity;
Antalet anslutningar som används för närvarande är:
SELECT COUNT(*) from pg_stat_activity;
Felsökningsstrategi
-
Du kan ge olika användarnamn/lösenord till de program som kanske inte släpper anslutningarna för att ta reda på vilket det är, och sedan titta i pg_stat_activity för att ta reda på vilket som inte städar efter sig.
-
Gör en fullständig undantagsstackspårning när anslutningarna inte kunde skapas och följ koden tillbaka till där du skapar en ny
Connection
, se till att varje kodrad där du skapar en anslutning slutar med enconnection.close();
Så här ställer du in max_connections högre:
max_connections i postgresql.conf anger det maximala antalet samtidiga anslutningar till databasservern.
- Hitta först din postgresql.conf-fil
- Om du inte vet var den är, fråga databasen med sql:
SHOW config_file;
- Min är i:
/var/lib/pgsql/data/postgresql.conf
- Logga in som root och redigera filen.
- Sök efter strängen:"max_connections".
- Du kommer att se en rad som säger
max_connections=100
. - Sätt siffran högre, kontrollera gränsen för din postgresql-version.
- Starta om postgresql-databasen för att ändringarna ska träda i kraft.
Vad är det maximala antalet max_anslutningar?
Använd denna fråga:
select min_val, max_val from pg_settings where name='max_connections';
Jag får värdet 8388607
, i teorin är det det mesta du får ha, men då kan en skenande process äta upp tusentals anslutningar, och förvånande, din databas svarar inte förrän omstart. Om du hade ett vettigt max_connections som 100. Det felande programmet skulle nekas en ny anslutning.