如何解决单个 Java 应用程序实例中的多个 Gremlin 集群
在一个 java 应用程序实例可以与多个 Gremlin 服务器通信的场景中(比如 CosmosDB 中的多个图实例)。在这种情况下创建和缓存 Gremlin 客户端的建议是什么。看起来在我的 mac 上,我可以创建的最大集群实例数少于 300。除此之外,我收到“打开的文件太多异常”。
caused by: java.io.IOException: Too many open files
java.lang.IllegalStateException: failed to create a child event loop
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:88)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:58)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:47)
at io.netty.channel.MultithreadEventLoopGroup.<init>(MultithreadEventLoopGroup.java:59)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:86)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:81)
at io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:68)
at org.apache.tinkerpop.gremlin.driver.Cluster$Factory.<init>(Cluster.java:1065)
有办法解决吗?这是对 graphUserName
的许多不同值所做的。
final Cluster cluster = Cluster.build()
.addContactPoint("host")
.port(443)
.credentials(graphUserName,"graph-password")
.serializer("serializer)
.enableSsl(true)
.create();
cluster.connect());
解决方法
您应该为应用程序的生命周期创建一个 Cluster
对象。假设您使用的是无会话请求,那么您也只能从该 Client
创建一个 Cluster
实例并重新使用它。当然,在某些情况下,单个 Cluster
对象可能不够用。有些驱动程序配置选项只能应用于 Cluster
对象,而不能应用于它产生的 Client
实例。例如,如果您有多种身份验证方法或要连接到不同的服务器,则这些设置将绑定到 Cluster
,这将要求您拥有多个这些对象。
虽然您总是希望小心管理驱动程序的设置,但打开大量具有默认设置的 Cluster
对象(这是大多数人开始的地方)可能会触发 {{1}你所看到的。每个 caused by: java.io.IOException: Too many open files
对象都会打开许多网络资源,除非您更改了操作系统中的默认设置,否则您很可能会超出文件限制。此消息是操作系统级别的问题,互联网上有 many resources 可供解决。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。