web-dev-qa-db-de.com

AWS RDS PostgreSQL-Fehler "verbleibende Verbindungsschlitze sind für Nicht-Replikations-Superuser-Verbindungen reserviert"

Im Dashboard, das ich sehe, gibt es derzeit 22 offene Verbindungen zur DB-Instanz, die neue Verbindungen mit dem Fehler blockieren: 

die verbleibenden Verbindungssteckplätze sind für Nicht-Replikations-Superuser-Verbindungen reserviert.

Ich greife auf die Datenbank von der Web-Service-API zu, die auf der EC2-Instanz ausgeführt wird, und halte mich immer an die bewährten Methoden:

Connection connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
Class.forName(DB_CLASS);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(SQL_Query_String);
...
resultSet.close();
statement.close();
connection.close();
  1. Kann ich etwas anderes im Code tun?

  2. Sollte ich noch etwas in der DB-Verwaltung tun?

  3. Gibt es eine Möglichkeit, Verbindungen periodisch zu schließen?

13
michael

Amazon muss die Anzahl der Verbindungen basierend auf dem Recht jedes Modells festlegen, um eine bestimmte Menge an Speicher und Verbindungen zu fordern

MODEL      max_connections innodb_buffer_pool_size
---------  --------------- -----------------------
t1.micro   34                326107136 (  311M)
m1-small   125              1179648000 ( 1125M,  1.097G)
m1-large   623              5882511360 ( 5610M,  5.479G)
m1-xlarge  1263            11922309120 (11370M, 11.103G)
m2-xlarge  1441            13605273600 (12975M, 12.671G)
m2-2xlarge 2900            27367833600 (26100M, 25.488G)
m2-4xlarge 5816            54892953600 (52350M, 51.123G)

Wenn Sie möchten, können Sie jedoch die maximale Verbindungsgröße in benutzerdefiniert ändern 

Über RDS Console> Parametergruppen> Parameter bearbeiten

Sie können den Wert des Parameters max_connections in einen benutzerdefinierten Wert ändern.

Um die Verbindungen regelmäßig zu schließen, können Sie einen Cron-Job wie folgt einrichten.

select pg_terminate_backend(procpid)
from pg_stat_activity
where usename = 'yourusername'
 and current_query = '<IDLE>'
 and query_start < current_timestamp - interval '5 minutes';
14
error2007s

sie können die maximalen Verbindungen im Parameters Group für Ihre RDS-Instanz ändern. Versuchen Sie, es zu erhöhen. Sie können auch versuchen, Ihre Instanz zu aktualisieren, da die max-Anzahl der Verbindungen auf {DBInstanceClassMemory/31457280} gesetzt ist.

http://docs.aws.Amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html

3
lordgun

Ich verwende Amazon RDS, SCALA, Postgresql & Slick. Zunächst hängt die Anzahl der verfügbaren Verbindungen in RDS von der Menge der verfügbaren RAM - d. H. Der Größe der RDS-Instanz ab. Es ist am besten die Standardverbindungsnummer nicht zu ändern.

Sie können die maximale Verbindungsnummer überprüfen, indem Sie die folgende SQL-Anweisung in Ihrer RDS DB-Instanz ausführen:

show max_connections; 

Überprüfen Sie Ihre SPRING-Konfiguration, um wie viele Threads Sie anzuzeigen:

database {
  dataSourceClass = org.postgresql.ds.PGSimpleDataSource
  properties = {
    url = "jdbc:postgresql://test.cb1111.us-east-2.rds.amazonaws.com:6666/dbtest"
    user = "youruser"
    password = "yourpass"
  }
  numThreads = 90
}

Alle Verbindungen ARE werden hergestellt bei SRING BOOT Initialisierung, achten Sie also darauf, das RDS-Limit nicht zu überschreiten. Dies schließt andere Dienste ein, die eine Verbindung zur DB herstellen. In diesem Fall beträgt die Anzahl der Verbindungen 90+.

Die aktuelle Grenze für db.t2.small ist 198 (4 GB RAM).

 enter image description here