AWS RDS PostgreSQL ошибка "оставшиеся слоты для подключения зарезервированы для соединений с невосстановимыми суперпользователями"

На панели инструментов, которую я вижу, в настоящее время имеется 22 открытых соединения с экземпляром БД, блокирующих новые соединения с ошибкой:

оставшиеся слоты соединений зарезервированы для соединений суперпользователя без репликации.

Я обращаюсь к БД из API веб-сервиса, работающего на экземпляре EC2, и всегда придерживаюсь следующих рекомендаций:

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. Могу ли я сделать что-то еще в коде?

  2. Должен ли я сделать что-то еще в управлении БД?

  3. Есть ли способ периодически закрывать связи?

Ответ 1

Amazon должна установить количество подключений на основе каждой модели, чтобы требовать определенный объем памяти и соединений

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)

Но если вы хотите, вы можете изменить максимальный размер соединения на пользовательский с помощью

В консоли RDS > Группы параметров > Изменить параметры,

Вы можете изменить значение параметра max_connections на пользовательское значение.

Чтобы периодически закрывать соединения, вы можете настроить работу cron примерно так.

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

Ответ 2

вы можете изменить максимальные соединения в Parameters Group для вашего экземпляра RDS. Попытайтесь увеличить его. Или вы можете попробовать обновить свой экземпляр, так как максимальные соединения установлены на {DBInstanceClassMemory/31457280}

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

Ответ 3

Я использую Amazon RDS, SCALA, Postgresql и Slick. Прежде всего - количество доступных подключений в RDS зависит от количества доступных ОЗУ - то есть размера экземпляра RDS. Лучше всего не изменять номер подключения по умолчанию.

Вы можете проверить номер максимального соединения, выполнив следующий оператор SQL в вашем экземпляре DB RDS:

show max_connections; 

Проверьте конфигурацию SPRING, чтобы увидеть количество потоков, которые вы создаете:

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
}

Все соединения ARE сделаны при SRING BOOT инициализации, поэтому не переходите границу RDS. Это включает другие службы, которые подключаются к БД. В этом случае количество подключений будет равно 90 +.

Текущее ограничение для db.t2.small 198 (4 ГБ ОЗУ)

введите описание изображения здесь