AWS RDS PostgreSQL 错误 "remaining connection slots are reserved for non-replication superuser connections"

AWS RDS PostgreSQL error "remaining connection slots are reserved for non-replication superuser connections"

在仪表板中,我看到当前有 22 个打开的数据库实例连接,阻止新连接并出现错误:

remaining connection slots are reserved for non-replication superuser connections.

我正在从 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. 有没有定时关闭连接的方法?

您可以在 Parameters Group 中为您的 RDS 实例更改最大连接数。尝试增加它。 或者您可以尝试升级您的实例,因为最大连接数设置为 {DBInstanceClassMemory/31457280}

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

亚马逊要根据每个机型对一定内存和连接数的要求来设置连接数

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

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

您可以通过在 RDS 数据库实例上执行以下 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(4GB 内存)

您可以更改参数组 idle_in_transaction_session_timeout 以删除空闲连接。

idle_in_transaction_session_timeout (integer)

Terminate any session with an open transaction that has been idle for longer than the specified duration in milliseconds. This allows any locks held by that session to be released and the connection slot to be reused; it also allows tuples visible only to this transaction to be vacuumed. See Section 24.1 for more details about this.

The default value of 0 disables this feature.

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