6

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

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

我有一个烧瓶应用程序,并且正在开发中,我正在使用内部烧瓶应用程序服务器。(在产品中,我将使用带有 uwsgi 的 docker 容器,但这个问题与我的开发设置有关。)

我已将 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,但我认为它们与我无关。

提交执行函数时发生错误。我传递给它的 queryFN 是一个非常简单的单行程序,几乎不需要时间来执行。

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

将 neo4j 与 Flask 一起使用的推荐方法是什么?我已经看过这个例子https://github.com/neo4j-examples/movies-python-bolt/blob/master/movies.py但他们只是像我一样只有一个驱动程序对象。(除了它是全局的,不在一个类中,但我的功能是一样的。)

我应该在哪里调试这个问题?

4

0 回答 0