【问题标题】:Is neo4j-jdbc driver 3.x thread safeneo4j-jdbc 驱动程序 3.x 线程安全吗
【发布时间】:2017-05-15 18:36:37
【问题描述】:

我正在运行一个安装程序,我使用 jdbc API 安装 neo4j-jdbc 驱动程序来连接到 VM 中的 neo4j 数据库,并且在执行一些多线程工作时遇到了死锁问题。我想知道是否有人知道neo4j-jdbc 驱动程序3.x 是否是线程安全的?

错误日志

Exception: java.sql.BatchUpdateException: org.neo4j.driver.v1.exceptions.TransientException: LockClient[4211] can't wait on resource RWLock[NODE(2410), hash=1674994875] since => LockClient[4211] <-[:HELD_BY]- RWLock[NODE(2403), hash=1544505462] <-[:WAITING_FOR]- LockClient[4205] <-[:HELD_BY]- RWLock[NODE(2410), hash=1674994875]
org.neo4j.jdbc.bolt.BoltPreparedStatement.executeBatch(BoltPreparedStatement.java:178)
org.apache.commons.dbcp2.DelegatingStatement.executeBatch(DelegatingStatement.java:345)
org.apache.commons.dbcp2.DelegatingStatement.executeBatch(DelegatingStatement.java:345)
org.apache.beam.sdk.io.jdbc.JdbcIO$Write$WriteFn.finishBundle(JdbcIO.java:480)
Caused By: org.neo4j.driver.v1.exceptions.TransientException: LockClient[4211] can't wait on resource RWLock[NODE(2410), hash=1674994875] since => LockClient[4211] <-[:HELD_BY]- RWLock[NODE(2403), hash=1544505462] <-[:WAITING_FOR]- LockClient[4205] <-[:HELD_BY]- RWLock[NODE(2410), hash=1674994875]
org.neo4j.driver.internal.connector.socket.SocketResponseHandler.handleFailureMessage(SocketResponseHandler.java:71)
org.neo4j.driver.internal.messaging.PackStreamMessageFormatV1$Reader.unpackFailureMessage(PackStreamMessageFormatV1.java:464)
org.neo4j.driver.internal.messaging.PackStreamMessageFormatV1$Reader.read(PackStreamMessageFormatV1.java:425)
org.neo4j.driver.internal.connector.socket.SocketClient.receiveOne(SocketClient.java:130)
org.neo4j.driver.internal.connector.socket.SocketConnection.receiveOne(SocketConnection.java:143)
Stack trace truncated. Please see Cloud Logging for the entire trace.

【问题讨论】:

  • 什么样的死锁问题?请显示错误日志。
  • 用错误日志更新了描述。

标签: jdbc neo4j google-cloud-platform google-cloud-dataflow


【解决方案1】:

死锁是存在并发请求时“正常”neo4j 行为的结果。你应该知道 neo4j 的 default locking behaviordocumentation on deadlocks

这可能是最有帮助的段落:

遇到频繁的死锁表明并发写入 请求以无法执行的方式发生 他们同时实现了预期的隔离和 一致性。解决方案是确保并发更新发生在 一种合理的方式。例如,给定两个特定节点(A 和 B), 以随机顺序添加或删除这两个节点的关系 对于每个事务,当有两个或 更多交易同时进行。一种解决方案是使 确保更新总是以相同的顺序发生(先 A,然后 B)。 另一种解决方案是确保每个线程/事务不 与其他节点或关系有任何冲突的写入 并发事务。例如,这可以通过让一个 单个线程执行特定类型的所有更新。

【讨论】:

  • 谢谢你的回答。我的设置不允许线程遵循特定的顺序,我也不能放置 trycatch 子句进行重试。但是我能够通过使用neo4j-java-driver 并为每个线程创建一个新驱动程序来解决这个问题,因为java 驱动程序是线程安全。这就是为什么我想知道neo4j-jdbc-driver 是否也是线程安全
  • 线程安全驱动程序不会防止死锁。避免 neo4j 死锁的唯一方法是了解 neo4j 自动锁定的工作原理以及在必要时如何解决此问题。
  • 顺便说一句,neo4j-jdbc 3.X 在后台使用 neo4j-java-driver 并且需要它进行事务处理。我可以假设如果 neo4j-java-driver 适合您,neo4j-jdbc 驱动程序也一样(如果您使用的是 BOLT 协议)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2019-06-27
  • 2017-10-04
  • 1970-01-01
相关资源
最近更新 更多