AWS RDS PostgreSQL报错:“remaining connection slots are reserved for non-replication superuser connections”。

44

在控制面板中,我看到当前有22个对数据库实例的打开连接,导致新的连接出现错误:

剩余连接插槽保留给非复制超级用户连接。

我从运行在EC2实例上的Web服务API访问数据库,并始终遵循最佳实践:

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. 有没有一种方法可以定期关闭连接?

4个回答

46

亚马逊必须根据每个模型对某一定量内存和连接的需求权利来设置连接数。

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';

1
谢谢,有没有办法定期关闭连接? - michael
顺便问一下,我该如何在AWS RDS中添加cron job?谢谢。 - michael
我有EC2 / Elastic Beanstalk环境。 有没有办法从那里运行?从未编写过cron作业...谢谢。 - michael
1
首先,您需要确保可以从该实例访问RDS。设置cron作业非常容易,只需在Google上搜索运行脚本文件的cron作业,您将找到大量文档。 - error2007s
2
这是连接数的官方来源:https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Managing.Performance.html - poitroae
显示剩余4条评论

12

我正在使用Amazon RDS、SCALA、Postgresql & Slick。首先,RDS可用连接数取决于可用RAM的数量,即RDS实例的大小。最好不要更改默认的连接数

您可以通过在RDS DB实例上执行以下SQL语句来检查最大连接数:

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
}

所有连接都在SRING BOOT初始化时建立,因此要注意不要超过RDS限制。这包括连接到数据库的其他服务。在这种情况下,连接数将超过90个。

db.t2.small目前的限制是198(RAM为4GB)

输入图像描述


1
很好的答案。 - michael

9

您可以在参数组idle_in_transaction_session_timeout中更改以移除空闲连接。

idle_in_transaction_session_timeout(整数)

终止任何处于空闲状态的具有打开事务的会话,其空闲时间超过指定毫秒数。这允许释放该会话持有的任何锁,并重用连接插槽;它还允许清理仅对该事务可见的元组。有关此内容的更多详细信息,请参见第24.1节。

默认值为0,禁用此功能。

AWS RDS中的当前值为86400000,转换为小时是(86400000/1000/60/60)24小时。


5

3
谢谢,有没有定期关闭连接的方法? - michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接