我们的任务是将相当多的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
错误。
答案 0 :(得分:0)
您可能在neo4j-bolt-driver中使用线程不安全功能。
Neo4j-bolt-driver提供了2个版本的驱动程序:
Driver
普通司机DriverPool
管理连接池的驱动程序驱动程序对象本身是线程安全的,但代表底层连接的Conn
对象不是。您可能以不应该使用的方式使用Conn
对象。
使用goroutines,最好使用Conn
方法创建DriverPool
个对象。在连接上调用Close
时,它不必关闭底层连接并回收连接以便重用。