限制客户端连接的数量和长度

您可以管理用户可以向服务器打开的活动会话数,以及这些会话的持续时间。这样有助于防止过度使用可用资源,并可以提高总体吞吐量。

您可以在两个级别定义连接限值:

  • 为各个用户设置 MAXCONNECTIONS 属性。此属性指定用户可以在各个节点上或跨数据库群集同时打开的会话数。例如,以下 ALTER USER 语句允许用户 Joe 最多打开 10 个并发会话:

    => ALTER USER Joe MAXCONNECTIONS 10 ON DATABASE;
    
  • 对数据库或各个节点设置配置参数 MaxClientSessions。此参数指定可以在数据库群集中的节点上运行的最大客户端会话数,默认设置为 50。系统会始终为 dbadmin 用户额外保留五个会话。这使他们能够在客户端会话总数等于 MaxClientSessions 时登录。

与给定节点建立的客户端连接总数不能超过 MaxClientSessions 中设置的限值。

对客户端 MAXCONNECTIONS 属性进行更改不会对当前会话产生影响;这些更改将仅应用于新会话。例如,如果将用户的连接模式从 DATABASE 更改为 NODE,则当前节点连接不会受到影响。此更改仅应用于 在调用节点上保留的新会话。

限制空闲会话长度

空闲会话最终会超时。可以在三个级别设置允许会话空闲的最长时间,按优先级降序排列:

  • 以 dbadmin 身份为各个用户设置 IDLESESSIONTIMEOUT 属性。此属性会覆盖所有其他会话超时设置。

  • 用户可以使用 SET SESSION IDLESESSIONTIMEOUT 来限制当前会话的空闲时间。非超级用户只能将会话空闲时间设置为不大于自己设置的 IDLESESSIONTIMEOUT 值。如果没有为用户显式设置会话空闲时间,则该用户的会话空闲时间将从节点或数据库设置继承。

  • 以 dbadmin 身份对数据库或各个节点设置配置参数 DEFAULTIDLESESSIONTIMEOUT。您可以使用配置参数 DEFAULTIDLESESSIONTIMEOUT 来限制默认数据库群集或各个节点。此参数会为所有非超级用户设置默认超时值。

所有设置都应用于持续处于空闲状态的会话,即未在运行查询的会话。如果客户端在查询执行期间很慢或没有响应,则该时间不会应用于超时。例如,流式批量插入所需的时间不会计入超时。从开始等待来自某会话的任何类型的消息那一刻起,服务器会将该会话标识为空闲。

查看会话设置

关闭用户会话

如有必要,您可以使用 CLOSE_USER_SESSIONS 手动关闭用户会话:

=> SELECT CLOSE_USER_SESSIONS ('Joe');
                             close_user_sessions
------------------------------------------------------------------------------
 Close all sessions for user Joe sent. Check v_monitor.sessions for progress.
(1 row)

用例示例

用户执行某个查询后,由于某种原因,该查询需要很长时间才能完成(例如,由于服务器流量或查询比较复杂)。在这种情况下,用户可能会认为该查询失败并打开另一个会话来运行相同查询。现在,两个会话会使用额外的连接运行相同的查询。

为了防止出现这种情况,您可以通过修改其 MAXCONNECTIONS 用户属性来限制各个用户可以运行的会话数。这样有助于最大程度地降低运行冗余查询的概率。此外,还有助于防止用户使用数据库所设置的所有可用连接。例如,针对用户 SuzyQ 的以下设置将限制该用户在任何时候运行的数据库会话不得超过两个:

=> CREATE USER SuzyQ MAXCONNECTIONS 2 ON DATABASE;

当用户多次连接到服务器时,可限制设置客户端连接所能防止出现的另一个问题。用户连接过多会耗尽数据库配置参数 MaxClientSessions 所设置的允许连接数。

群集更改和连接

当群集发生以下变化时,客户端连接限值的行为可能会发生变化:

  • 添加或移除节点。

  • 节点发生故障或恢复。

连接请求之间的节点可用性发生变化对连接限值的影响较小。

就遵守连接限值而言,当节点在连接请求之间发生故障或恢复时,不会产生重大影响。无需执行特别操作来处理此问题。但是,如果节点发生故障,其活动会话将退出且群集中的其他节点也会删除自己的会话。这将释放连接。查询可能会挂起,在这种情况下,会话被阻止合乎情理且符合预期。