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
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 ГБ ОЗУ)
![введите описание изображения здесь]()