py2neo和最终的一致性?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了py2neo和最终的一致性?相关的知识,希望对你有一定的参考价值。
我正在使用Flask调试服务器中的Py2Neo 3(v3.1.1)来访问Neo4j。
Neo4j服务器是Ubuntu 16.04上基本的apt-get'd Neo4j服务器(3.3.3)。 Py2Neo正在使用Bolt端口。
当Flask请求更新Neo4j数据库时
tx = graph.begin();
....
tx.commit();
后面是来自同一客户端的请求,在四秒或更长时间内,95%的时间,第二个查询的结果不反映刚刚发生在几秒钟前的更新。但是,如果另一个客户端在更新后立即通过Flask服务器查询数据库,则每次都会看到更新的数据。似乎,如果第二个客户端这样做,第一个客户端看到旧数据的可能性下降到大约75%。
我很确定Neo4j没有以Causal一致模式运行。 (当我安装Neo4j时,我做了一个简单的apt-get安装。)我该如何确认?
我相信Flask服务器正在为所有请求使用相同的Py2Neo图形对象。
如上所述,Py2Neo更新请求确实使用显式事务,后跟显式tx.commit()。但是该图形对象已经用于一些自动提交查询以及显式事务之外。
我没有在Py2Neo 3文档中看到任何提及“因果关系”或“最终”或“缓存”的内容。
你有什么建议?
---更新1 -----
这似乎不是Neo4j服务器问题。打开Py2Neo.watch('neo4j.bolt')显示Py2Neo向Neo4j服务器发送了正确的请求,并且Py2Neo正在从Neo4j服务器接收更新的数据。但Py2Neo Cursor.data()显示旧数据返回给应用程序,尽管服务器给出Py2Neo新数据。
人们实际上可以在这里找到一个部分答案:Is py2neo caching burning me?
引用的页面表明您可能会受益于对my_node.pull()的调用。这应该工作,但我认为你会发现它实际上是低效的,因为它导致对数据库的另一个非平凡的请求,尽管已经从数据库中有效地接收了一个(或更多)次的正确值然后被忽略。
作为替代方案,请考虑使用Neo Technologies发布+支持的Python驱动程序以及Py2Neo正在使用的。如果你这样做,你将失去Py2Neo的一些功能(例如OGM),但你可以更好地控制你的应用程序和Neo4j服务器之间的对话,以及你的堆栈中少一个,可能是错误的层。你可以找到有关这个Python驱动程序和其他选项here的信息。
以上是关于py2neo和最终的一致性?的主要内容,如果未能解决你的问题,请参考以下文章
xml Eclipse模板(代码片段)检查参数并最终抛出IllegalArgumentException