我们的任务是将相当多的xml数据(127万个xml文件,每个文件包含一个属性的节点)迁移到Neo图中,我们一直在使用go例程来咀嚼文件,解析xml,准备cypher查询因为必须处理xml的体系结构,我们使用go例程与通道同时处理线程中的每个文件,限制一次进行的工作数。
我遇到的问题是我遇到了诸如“通过对等方重置tcp连接”之类的错误以及“恐慌:无法读取消息长度的预期字节。读取:0预期:2。”我只能想象这是因为我们的工人同时运行连接和语句。我们的限制让我们有100名兼职工人,我不认为这对Neo来说是一个主要问题,但我无法弄清楚为什么它会让我们感到窒息。
是否有任何架构建议用于处理这样的用例,我们必须在大量的工作例程中运行单个cypher语句(在我们的例子中一次100个)?
目前,我们正在走一个文件树来构建要处理的文件队列,然后在完成步骤之后,我们迭代该队列并触发go例程来处理每个文件,使用缓冲的油门通道来阻止关闭直到先前的例程完成之前的新例程。在每个例程中,我正在启动一个新连接,准备语句,执行,关闭等。
我看到这个包提供了Pipelines,但我不知道如何在我们目前使用的处理/队列/通道架构中使用它:
https://github.com/johnnadratowski/golang-neo4j-bolt-driver
我也尝试过使用:
但是在尝试同时连接到Neo时仍然会遇到tcp connection reset by peer
错误。
您可能在neo4j-bolt-driver中使用线程不安全功能。
Neo4j-bolt-driver提供了2个版本的驱动程序:
Driver
平原司机DriverPool
驱动程序驱动程序对象本身是线程安全的,但代表底层连接的Conn
对象不是。你可能以一种不应该使用的方式使用Conn
对象。
使用goroutines,最好使用Conn
方法创建DriverPool
对象。在连接上调用Close
时,它不一定关闭底层连接并回收连接以便重用。