

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

# 将查询以字节码而不是字符串的格式发送到服务器
<a name="best-practices-gremlin-java-bytecode"></a>

在提交查询时，使用字节码而不是字符串具有以下好处：
+ **及早捕获无效查询语法：**使用字节码变量让您可以在编译阶段检测到无效的查询语法。如果您使用基于字符串的变量，则在将查询提交到服务器并返回错误之前，您无法发现无效语法。
+ **避免基于字符串的性能损失：**[任何基于字符串的查询提交，无论是使用 WebSockets 还是 HTTP，都会导致顶点分离，这意味着 Vertex 对象由 ID、Label 和与顶点关联的所有属性组成（请参阅元素的属性）。](http://tinkerpop.apache.org/docs/current/reference/#_properties_of_elements)

  这会导致当无需属性时在服务器上产生不必要的计算。例如，在客户希望使用查询 `g.V("hakuna#1")` 获得 ID 为“hakuna\$11”的顶点时。如果查询是以基于字符串的提交形式发送，服务器将花费时间在 ID、标签以及此顶点的所有属性中检索。如果查询是以字节码提交的形式发送，服务器仅花时间检索顶点的 ID 和标签。

换而言之，不要提交类似于下文的查询：

```
  final Cluster cluster = Cluster.build("localhost")
                                 .port(8182)
                                 .maxInProcessPerConnection(32)
                                 .maxSimultaneousUsagePerConnection(32)
                                 .serializer(Serializers.GRAPHBINARY_V1D0)
                                 .create();

  try {
      final Client client = cluster.connect();
      List<Result> results = client.submit("g.V().has('name','pumba').out('friendOf').id()").all().get();
      System.out.println(verticesWithNamePumba);
  } finally {
      cluster.close();
  }
```

而是使用字节码提交查询，如下所示：

```
  final Cluster cluster = Cluster.build("localhost")
                                 .port(8182)
                                 .maxInProcessPerConnection(32)
                                 .maxSimultaneousUsagePerConnection(32)
                                 .serializer(Serializers.GRAPHBINARY_V1D0)
                                 .create();

  try {
      final GraphTraversalSource g = traversal().withRemote(DriverRemoteConnection.using(cluster));
      List<Object> verticesWithNamePumba = g.V().has("name", "pumba").out("friendOf").id().toList();
      System.out.println(verticesWithNamePumba);
  } finally {
      cluster.close();
  }
```