微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决随着更多并发用户连接,Neo4j连接错误

  • Neo4j 3.5.12社区
  • Python 3.6.9
  • neo4j-driver == 1.7.6
  • neobolt == 1.7.17
  • Ubuntu Server 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,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作业,但这似乎只能起到部分作用。

我根据this article增加页面缓存和堆计算。

我将“打开文件数限制”从认的1024增加到50000。

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

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

配置文件

db = None
def getDB():
    global db
    if not db:
        db = GraphDatabase.driver("bolt://localhost:XXXXXX",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分钟运行一次,并且每次都使驱动程序实例保持打开状态。小学生错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。