问题描述
我正在使用Neptune(AWS)图形数据库,并且我的客户端api在Java spring中。我的应用程序读写数据库。实际上,我们有2个集群作为Bean进行读写。我们正在生成多个遍历,并且在提交每个遍历之后,我们决定使用try with ressource将其遍历。
关闭遍历并重新创建traversal().withRemote(..)
是最佳实践吗?
在一个线程中具有多个连接的大型项目中,最佳实践是什么?
解决方法
如果代码长期运行,则Java的典型最佳实践(假设您正在使用Gremlin Java客户端)是使用该客户端创建连接池,并在线程之间共享该图遍历源对象(g)。线程将共享连接池。如果您的应用程序是多线程的,则要实现高吞吐量所需的大量线程大约是您所连接的Neptune实例上的虚拟CPU数量的两倍。如果您的应用程序能够维持状态并且长时间运行,则无需继续打开和关闭连接。如果您的应用程序更短暂(例如,定期启动和停止容器或使用AWS Lambda函数),那么在每次调用时创建和关闭连接通常是最佳实践。如果您的代码运行时间较长(例如在服务器中),则保持连接池打开并在应用程序中的线程之间共享连接通常是最好的方法。这样避免了每次发出一些查询时创建新连接池的开销。
如果连接闲置了一段时间,海王星可能会关闭它。如果您使用的是Gremlin Java,则客户端会包含一个保持活动的ping。
如果您使用的是IAM身份验证,则凭据过期10天后,连接将关闭。
这里有一些有关Amazon Neptune的Web套接字行为的文档:https://docs.aws.amazon.com/neptune/latest/userguide/limits.html#limits-websockets
此处有一些与Java客户端有关的其他信息:https://docs.aws.amazon.com/neptune/latest/userguide/best-practices-gremlin-java-client.html