避免在Flask应用程序中使用neo4j时无法读取失效的连接

2024-09-29 23:32:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用以下版本的neo4j库:

neo4j==1.7.2
neobolt==1.7.9
neotime==1.7.4

我有一个flask应用程序,在开发中我使用内部flask应用服务器。(在prod中,我将使用一个带有uwsgi的docker容器,但是这个问题是关于我的dev设置的。)

我将neo4j封装到一个类中,我的应用程序维护这个类的一个实例:

class ChartStoreConnectionClass():
  driver = None

  def __init__(self, configDict):
    self.driver = neo4j.GraphDatabase.driver(
      configDict["boltUri"],
      auth=(configDict["basicAuthUsername"], configDict["basicAuthPassword"]),
      encrypted=True,
      trust=neo4j.TRUST_SYSTEM_CA_SIGNED_CERTIFICATES,
      # trust=neo4j.TRUST_ALL_CERTIFICATES,
      # trust=neo4j.TRUST_CUSTOM_CA_SIGNED_CERTIFICATES, Custom CA support is not implemented
    )

  def readonlyQuery(self, queryFN):
    res = None
    with self.driver.session() as session:
      tx = session.begin_transaction()
      res = queryFN(tx)
      tx.rollback()
    return res

  def execute(self, queryFN):
    res = None
    with self.driver.session() as session:
      tx = session.begin_transaction()
      res = queryFN(tx)
      tx.commit()
    return res

此设置可以运行一段时间,但有时会出现以下错误:

neobolt.exceptions.ServiceUnavailable: Failed to read from defunct connection Address(host='127.0.0.1',
port=7687)

当我简单地重试请求时,它会在第二次工作。我已经阅读了错误消息,发现了多篇关于多线程和多进程环境中neo4j的帖子,但我不相信它们与我有关。你知道吗

提交execute函数时出错。我传递给它的queryFN是一个非常简单的单行程序,几乎不需要时间来执行。你知道吗

我的应用程序只有一个驱动程序实例是错误的吗?(我认为这样做是因为驱动程序创建了一个连接池,而且我的应用程序有一个连接池是合理的。)

建议使用neo4j和烧瓶的方法是什么? 我已经看过这个例子https://github.com/neo4j-examples/movies-python-bolt/blob/master/movies.py,但它们只是以与我相同的方式拥有一个驱动程序对象。(除了在类中不是全局的,但在功能上我的是相同的。)

我应该在哪里调试这个问题?你知道吗


Tags: selfnone应用程序sessiondefdriverresca

热门问题