图数据库GDB支持修改客户端向图数据库GDB发送请求数据时的超时时间,您可以根据业务场景和数据量等修改超时时间。本文介绍不同语言环境中配置Gremlin请求超时时间的方法。
超时时间简介
客户端向图数据库GDB发送请求数据时,如果请求时间超过图数据库GDB设置的超时时间(默认为1800毫秒),则会发生超时现象,造成结果无法返回的现象。
超时时间的值为Long类型,单位为毫秒。
建议您不要配置过大的超时时间。
当客户端和图数据库GDB的连接在请求超时前断开时,会导致新的请求不生效。
使用各种语言配置超时时间
以下介绍各语言接入使用scripts请求的超时时间配置,示例配置超时时间为5000毫秒。
Java
在客户端安装Java和Maven工具。
执行如下命令,安装Java(以1.8.0版本为例)。
sudo yum install java-1.8.0-devel
执行如下命令,添加具有Maven程序包的存储库。
wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
执行如下命令,设置存储库的版本号(以4.0.0为例)。
sudo sed -i s/4.0.0/6/g /etc/yum.repos.d/epel-apache-maven.repo
执行如下命令,安装Maven工具。
sudo yum install -y apache-maven
说明如果回显信息中报类似XXX的错误,您可以执行以下任意一种命令安装Maven。
sudo yum install -y apache-maven --skip-broken
sudo yum install -y apache-maven --nobest
创建用于连接图数据库GDB实例的配置文件(以pom.xml为例)。
执行如下命令,创建并进入配置文件所在目录。
mkdir gdb-gremlin-test cd gdb-gremlin-test
执行如下命令,创建pom.xml文件。
touch pom.xml
执行如下命令,编辑pom.xml文件。
vi pom.xml
输入
i
,将以下内容复制至pom.xml文件中。<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.gdb.alibaba</groupId> <artifactId>GdbGremlinExample</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>GdbGremlinExample</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>org.apache.tinkerpop</groupId> <artifactId>gremlin-driver</artifactId> <version>3.4.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.0.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.3</version> <configuration> <mainClass>com.gdb.alibaba.Test</mainClass> <complianceLevel>1.8</complianceLevel> </configuration> </plugin> </plugins> </build> </project>
按Esc键,输入
:wq
退出vi编辑器。
创建用于连接Java客户端的配置文件(以Test.java为例)。
执行如下命令,创建并进入配置文件所在目录。
mkdir -p src/main/java/com/gdb/alibaba/ cd src/main/java/com/gdb/alibaba
执行如下命令,创建Test.java文件。
touch Test.java
执行如下命令,编辑Test.java文件。
vi Test.java
输入
i
,将以下内容根据业务需求在本地修改完成后复制粘贴至Test.java文件中。package com.gdb.alibaba; import org.apache.tinkerpop.gremlin.driver.Cluster; import org.apache.tinkerpop.gremlin.driver.Client; import org.apache.tinkerpop.gremlin.driver.Result; import org.apache.tinkerpop.gremlin.driver.ResultSet; import org.apache.tinkerpop.gremlin.driver.RequestOptions; import java.util.List; import java.util.Map; import java.util.HashMap; import java.io.File; public class Test { public static void main( String[] args ) { try { if(args.length != 1) { System.out.println("gdb-remote.yaml path needed"); return; } String yaml = args[0]; // 1. 初始化客户端。 Cluster cluster = Cluster.build(new File(yaml)).create(); Client client = cluster.connect().init(); // 2. 配置超时时间为5000毫秒。 RequestOptions.Builder options = RequestOptions.build().timeout(5000); options.addParameter("G___id", "sand131_id_5_99"); String dsl = "g.V(G___id)"; // 3. 发送Gremlin请求到图数据库GDB服务端。 ResultSet results = client.submit(dsl, options.create()); List<Result> result = results.all().join(); result.forEach(p -> System.out.println(p.getObject())); // 4. 关闭客户端。 cluster.close(); } catch (Exception e) { System.out.println(e.getMessage()); } } }
按Esc键,输入
:wq
退出vi编辑器。
创建用于连接Java客户端和图数据库GDB实例的配置文件(以gdb-remote.yaml为例)。
执行如下命令,创建gdb-remote.yaml文件。
touch gdb-remote.yaml
执行如下命令,编辑gdb-remote.yaml文件。
vi gdb-remote.yaml
输入
i
,将以下内容按照业务需求在本地修改完成后复制粘贴至gdb-remote.yaml文件中。hosts: <your_gdb_endpoint> //<your_gdb_endpoint>为图数据库GDB实例的连接地址。 port: <port> //<port>为图数据库GDB实例的端口号。 username: <username> //<username>为图数据库GDB实例的账号。 password: <password> //<password>为图数据库GDB实例的账号密码。 serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1, config: { serializeResultToString: false } }
按Esc键,输入
:wq
退出vi编辑器。
编译并执行Java程序。
执行如下命令,进入pom.xml文件所在目录(即用于连接图数据库GDB实例的配置文件所在目录)。
cd /home/gdb-gremlin-test
执行如下命令,编译并执行Java程序。
mvn compile exec:java -Dexec.args="/home/apache-tinkerpop-gmlin-console-3.4.0/conf/gdb-remote.yaml"
Python
执行如下命令,初始化客户端。
client = client.Client('ws://${your-gdb-endpoint}:8182/gremlin', 'g', username="${username}", password="${password}")
执行如下命令,配置超时时间为5000毫秒。
dsl = "g.V(G___id)" parameters = {} parameters["G___id"] = "sand131_id_5_99" message = RequestMessage('', 'eval', {'gremlin': dsl, 'scriptEvaluationTimeout': 5000, 'bindings': parameters})
执行如下命令,发送请求至图数据库GDB服务端。
results = client.submit(message).all().result()
执行如下命令,关闭客户端。
client.close()
.Net
执行如下命令,初始化客户端。
var gremlinServer = new GremlinServer(endpoint, port, username: username, password: password); var gremlinClient = new GremlinClient(gremlinServer);
执行如下命令,配置超时时间为5000毫秒。
string dsl = "g.V(G___id)"; Dictionary<string, object> bindings = new Dictionary<string, object> {{"G___id", "sand131_id_5_99"}}; var msgBuilder = RequestMessage.Build(Tokens.OpsEval).AddArgument(Tokens.ArgsGremlin, dsl) .AddArgument(Tokens.ArgsBindings, bindings).AddArgument("scriptEvaluationTimeout", 5000);
执行如下命令,发送请求至图数据库GDB服务端。
await gremlinClient.SubmitAsync<T>(msgBuilder.Create()).ConfigureAwait(false);
关闭客户端。
Go
执行如下命令,初始化客户端。
settings := &goClient.Settings{ Host: host, Port: port, Username: username, Password: password, } client := goClient.NewClient(settings)
执行如下命令,配置超时时间为5000毫秒。
parameters := make(map[string]interface{}) parameters["G___id"] = "sand131_id_5_99" options := graph.NewRequestOptionsWithBindings(bindings) options.SetTimeout(5000)
执行如下命令,发送请求至图数据库GDB服务端。
dsl := "g.V(G___id)" results, err := client.SubmitScriptOptions(dsl, options)
执行如下命令,关闭客户端。
client.Close()
其他方法配置超时时间
Java bytecode
执行如下命令,初始化客户端。
Cluster cluster = Cluster.build(new File(yaml)).create(); Client client = cluster.connect().init();
执行如下命令,配置超时时间为5000毫秒。
g.with('scriptEvaluationTimeout', 5000).V().limit(1).toList();
执行如下命令,发送请求至图数据库GDB服务端。
List<Vertex> list = g.V().has("person","name","marko").out("knows").toList();
执行如下命令,关闭客户端。
cluster.close();
Java 请求超时时间配置
// 1. 初始化客户端 client
// 2. 配置请求参数,包括超时时间,bindings参数化
RequestOptions.Builder options = RequestOptions.build().timeout(5000);
options.addParameter("G___id", "sand131_id_5_99");
String dsl = "g.V(G___id)";
// 3. 发送请求到GDB服务端,同时提供请求的配置
ResultSet results = client.submit(dsl, options.create());
// 4. 结束任务后关闭客户端 client
将sand131_id_5_99替换为实际请求参数。
Gremlin-console 请求超时时间配置
:remote config timeout 5000
Python 请求超时时间配置
from gremlin_python.driver.request import RequestMessage
# 1. 初始化客户端 client
dsl = "g.V(G___id)";
parameters = {}
parameters["G___id"] = "sand131_id_5_99"
# 2. 配置请求,包括超时时间,bindings参数化,请求语句
message = RequestMessage('', 'eval', {'gremlin': dsl, 'scriptEvaluationTimeout': 5000, 'bindings': parameters})
# 3. 发送请求到GDB服务端,同时包含有请求的配置
results = client.submit(message).all().result()
# 4. 结束任务后关闭客户端 client
将sand131_id_5_99替换为实际请求参数。
.Net 请求超时时间配置
// 1. 初始化客户端 client
string dsl = "g.V(G___id)";
Dictionary<string, object> bindings = new Dictionary<string, object> {{"G___id", "sand131_id_5_99"}};
// 2. 配置请求,包括超时时间,bindings参数化,请求语句
var msgBuilder = RequestMessage.Build(Tokens.OpsEval).AddArgument(Tokens.ArgsGremlin, dsl)
.AddArgument(Tokens.ArgsBindings, bindings).AddArgument("scriptEvaluationTimeout", 5000);
// 3. 发送请求到GDB服务端,同时包含有请求的配置
await gremlinClient.SubmitAsync<T>(msgBuilder.Create()).ConfigureAwait(false);
// 4. 结束任务后关闭客户端 client
将sand131_id_5_99替换为实际请求参数。
Go 请求超时时间配置
import "github.com/aliyun/alibabacloud-gdb-go-sdk/gdbclient/graph"
// 1. 初始化客户端 client
parameters := make(map[string]interface{})
parameters["G___id"] = "sand131_id_5_99"
// 2. 配置请求参数,包括超时时间,bindings参数化
options := graph.NewRequestOptionsWithBindings(bindings)
options.SetTimeout(5000)
// 3. 发送请求到GDB服务端,同时提供请求的配置
dsl := "g.V(G___id)"
results, err := client.SubmitScriptOptions(dsl, options)
// 4. 结束任务后关闭客户端 client
将sand131_id_5_99替换为实际请求参数。
bytecode请求超时时间配置
图数据库支持bytecode请求的超时时间配置,Java 环境使用如下(其他环境暂不支持)。
g.with('scriptEvaluationTimeout', 2000).V().limit(1).toList()