

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 排除 `java.util.concurrent.TimeoutException` 问题
<a name="best-practices-gremlin-java-exceptions-TimeoutException"></a>

当 Gremlin 请求在等待其中一个`java.util.concurrent.TimeoutException`连接中的插槽可用时，客户端本身超时，Gremlin Java 客户端会抛出。 WebSocket 此超时持续时间由 `maxWaitForConnection` 客户端可配置参数控制。

**注意**  
由于在客户端上超时的请求从不会发送到服务器，因此它们不会反映在服务器上捕获的任何指标中，例如 `GremlinRequestsPerSec`。

这种超时通常通过以下两种方式之一引起：
+ **服务器实际上已达到最大容量。**如果是这样的话，服务器上的队列就会被填满，你可以通过监控[MainRequestQueuePendingRequests](cw-metrics.md#cw-metrics-available) CloudWatch 指标来检测到这一点。服务器可以处理的并行查询数量取决于其实例大小。

  如果 `MainRequestQueuePendingRequests` 指标未显示服务器上积累了待处理的请求，则服务器可以处理更多请求，而超时是由客户端节流造成的。
+ **客户端节流请求。**通常可以通过更改客户端配置设置来解决这个问题。

  可通过以下方式粗略估计客户端可以发送的最大并行请求数：

  ```
  maxParallelQueries = maxConnectionPoolSize * Max( maxSimultaneousUsagePerConnection, maxInProcessPerConnection )
  ```

  向客户端发送的查询超过 `maxParallelQueries` 会导致 `java.util.concurrent.TimeoutException` 异常。您可以通过多种方式解决这个问题：
  + *增加连接超时时间。*如果延迟对您的应用程序不重要，请增加客户端的 `maxWaitForConnection` 设置。然后，客户端会等待更长的时间才会超时，这反过来又会增加延迟。
  + *增加每个连接的最大请求数。*这允许使用同一个 WebSocket 连接发送更多请求。通过增加客户端的 `maxSimultaneousUsagePerConnection` 和 `maxInProcessPerConnection` 设置来实现此目的。这些设置通常应具有相同的值。
  + *增加连接池中的连接数。*通过增加客户端的 `maxConnectionPoolSize` 设置来实现此目的。代价是资源消耗增加，因为每个连接都使用内存和操作系统文件描述符，并且在初始化期间需要 SSL 和 WebSocket握手。