我正在使用以下版本的 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但他们只是像我一样只有一个驱动程序对象。(除了它是全局的,不在一个类中,但我的功能是一样的。)
我应该在哪里调试这个问题?