随着更多并发用户连接,Neo4j连接错误


  • Neo4j 3.5.12社区
  • Python 3.6.9
  • neo4j驱动程序==1.7.6
  • neobolt==1.7.17
  • Ubuntu服务器18.04
  • 烧瓶1.1.2

我运行的一台web服务器的流量突然增加了2000%。在这一增长之前,一切都很好。然而,现在我在交通繁忙的几个小时后(不确定持续时间,但在5小时内(看到以下错误,然后不断失败。就像连接没有关闭一样。

db = GraphDatabase.driver("bolt://localhost:MYPORTNO", auth=basic_auth(DATABASE_USERNAME, DATABASE_PASSWORD, encrypted=False)
File "/home/ubuntu/api/env/lib/python3.6/site-packages/neo4j/__init__.py", line 120, in driver
return Driver(uri, **config)
File "/home/ubuntu/api/env/lib/python3.6/site-packages/neo4j/__init__.py", line 161, in __new__
return subclass(uri, **config)
File "/home/ubuntu/api/env/lib/python3.6/site-packages/neo4j/__init__.py", line 235, in __new__
pool.release(pool.acquire())
File "/home/ubuntu/api/env/lib/python3.6/site-packages/neobolt/direct.py", line 715, in acquire
return self.acquire_direct(self.address)
File "/home/ubuntu/api/env/lib/python3.6/site-packages/neobolt/direct.py", line 608, in acquire_direct
connection = self.connector(address, error_handler=self.connection_error_handler)
File "/home/ubuntu/api/env/lib/python3.6/site-packages/neo4j/__init__.py", line 232, in connector
return connect(address, **dict(config, **kwargs))
File "/home/ubuntu/api/env/lib/python3.6/site-packages/neobolt/direct.py", line 972, in connect
raise last_error
File "/home/ubuntu/api/env/lib/python3.6/site-packages/neobolt/direct.py", line 962, in connect
s = _connect(resolved_address, **config)
File "/home/ubuntu/api/env/lib/python3.6/site-packages/neobolt/direct.py", line 843, in _connect
raise ServiceUnavailable("Failed to establish connection to {!r} (reason {})".format(resolved_address, error))
neobolt.exceptions.ServiceUnavailable: Failed to establish connection to ('127.0.0.1', MYPORTNO) (reason [Errno 111] Connection refused)

如果我重新启动apache,它会再次工作,所以目前作为一个创可贴,我每隔几个小时就在cron工作一次,但这似乎只是部分工作。

我根据这篇文章增加了页面缓存和堆计算。

我将"打开文件限制"从默认的1024增加到50000。

我将服务器规格提高了一倍。

从结构上讲,我在配置文件中创建了一个数据库驱动程序实例:

配置文件:

db = None
def getDB():
global db
if not db:
db = GraphDatabase.driver("bolt://localhost:XXXXXX", auth=basic_auth(DATABASE_USERNAME, DATABASE_PASSWORD), encrypted=False) 
return db

然后,我可以在模块文件中进行如下查询。我相信以下语法可以正确地管理由于with语句而打开和关闭的连接,因此不应该留下打开的连接:

模块文件:

db = config.getDB()
with db.session() as s:
with s.begin_transaction() as tx:
tx.run("the cypher", {the params})

我还在日志中看到以下错误,尽管我不确定它们是否直接相关。

ValueError: filedescriptor out of range in select()

有人知道是什么原因造成的吗?或者如何解决?谢谢

原来我有一个cron作业,每10分钟运行一次,每次都打开驱动程序实例。男生失误。

最新更新