
# DBService超过最大连接数后导致Hive MetaStore异常
#### 问题背景与现象
业务量较大导致DBService连接数超过了默认的最大值（可查看DBService的"dbservice.database.max.connections"参数获取），MetaStore出现异常，并报错"slots are reserved for non-replication superuser connections"：
```
2018-04-26 14:58:55,657 | ERROR | BoneCP-pool-watch-thread | Failed to acquire connection to jdbc:postgresql://10.*.*.*:20051/hivemeta?socketTimeout=60. Sleeping for 1000 ms. Attempts left: 9 | com.jolbox.bonecp.BoneCP.obtainInternalConnection(BoneCP.java:292)
org.postgresql.util.PSQLException: FATAL: remaining connection slots are reserved for non-replication superuser connections
at org.postgresql.core.v3.ConnectionFactoryImpl.readStartupMessages(ConnectionFactoryImpl.java:643)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:184)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:64)
at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:124)
at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:28)
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:20)
at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:30)
at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:22)
at org.postgresql.Driver.makeConnection(Driver.java:392)
at org.postgresql.Driver.connect(Driver.java:266)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:208)
at com.jolbox.bonecp.BoneCP.obtainRawInternalConnection(BoneCP.java:361)
at com.jolbox.bonecp.BoneCP.obtainInternalConnection(BoneCP.java:269)
at com.jolbox.bonecp.ConnectionHandle.<init>(ConnectionHandle.java:242)
at com.jolbox.bonecp.PoolWatchThread.fillConnections(PoolWatchThread.java:115)
at com.jolbox.bonecp.PoolWatchThread.run(PoolWatchThread.java:82)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
```
#### 原因分析
业务量大导致DBService的连接数超过了最大值，需要修改DBService的最大连接数。
#### 解决办法
1. 进入DBService服务配置页面： 
   - MRS 3.x之前版本，单击集群名称，登录集群详情页面，选择"组件管理 \> DBService \> 服务配置"，单击"基础配置"下拉菜单，选择"全部配置"。
     ![](https://support.huaweicloud.com/trouble-mrs/public_sys-resources/note_3.0-zh-cn.png)
     如果集群详情页面没有"组件管理"页签，请先完成IAM用户同步（在集群详情页的"概览"页签，单击"IAM用户同步"右侧的"同步"进行IAM用户同步）。
     
   
   - MRS 3.x及后续版本，登录FusionInsight Manager，然后选择"集群 \> 服务 \> DBService \> 配置 \> 全部配置"。
   
   
   
   
2. 搜索"dbservice.database.max.connections"配置项，并根据实际情况适当调大"dbservice.database.max.connections"配置的值。 
   该参数是数据库服务中用于配置数据库最大并发连接数的核心参数，用于限制同时连接到DBService的客户端数量上限。
   配置该参数需结合实际业务场景，不能盲目设置过大或过小，主要从以下几点进行考虑：
   - 节点资源配置：内存越大、CPU核心数越多，可支持的最大连接数通常越高。
   
   - 业务并发量：高峰时段的客户端并发请求数是核心关注指标，需确保参数值略高于实际高峰并发量，避免正常业务被拒绝。
   
   - 单连接的资源消耗：如果每个数据库连接对应的业务操作（如复杂查询、大事务）消耗资源较多，需适当降低最大连接数，反之可适当提高。
   
   
   
   
3. 保存配置，并重启受影响的服务或者实例。
4. 如果调整完还报超过最大连接数，需要排查业务代码，是否有连接泄露。
 
