java - 如何将自定义 Spring Data Neo4j 5.0.3 密码查询标记为只读

标签 java neo4j spring-data-neo4j spring-data-neo4j-5

我目前正在开发一个 Spring Data Neo4j 5.0.3 REST API 应用程序,它与由 3 个核心节点(1 个领导者和 2 个追随者)组成的 Neo4j 3.3.1 因果集群接口(interface)。无论好坏,我们还使用 session.query a la SQL prepared statements 向数据库提交了大量自定义密码查询。当我们这样做时,我们注意到几乎没有我们通过 session.query 提交的自定义 Cypher 被发送到任何只读关注者。

我破解了代码并注意到在 Neo4jSession 中,query 方法总是创建类型为 READ_WRITE 的事务。有什么方法可以解决这个问题,以便我们的查询正确地分布在我们的集群中吗?

我也尝试过用 @Transactional(readOnly = true) 标记适当的方法,但它似乎不起作用。当我进入 Neo4jTransactionManager 时,我在第 218 行看到以下内容:

private Transaction.Type getTransactionType(TransactionDefinition definition, Neo4jTransactionObject txObject) {
    Transaction.Type type;
    if (definition.isReadOnly() && txObject.isNewSessionHolder()) {
        type = Transaction.Type.READ_ONLY;
    } else if (txObject.transactionData != null) {
        type = txObject.transactionData.type();
    } else {
        type = Transaction.Type.READ_WRITE;
    }
    return type;
}

第一个分支中的第二个条件 isNewSessionHolder 是什么意思?在单个 HTTP API 调用的上下文中,我们至少调用了数据库 2 次,因此在第二次查询时,我相信此条件始终返回 false。

鉴于这些观察结果,是否有任何简单的方法可以让我的查询被视为只读?

最佳答案

关于 Spring 的第一部分:由于 Spring AOP 的限制,不可能在一个类中有多个隔离的事务。 最好的解决方案是将调用代码与不同类中的事务方法分开。然后 @Transactional(readOnly = true) 将起作用。

关于 OGM 的 session.query 调用的第二部分:如果您的工作单元参与现有的 READ_WRITE 事务,例如发生这种情况是因为上面的@Transactional AOP 问题,没有办法将类型设置为READ_ONLY。默认情况下,如果未设置显式类型,OGM 将始终创建一个 READ_WRITE 事务。

tl;博士;

这个问题一般有两种解决方案:

  1. @Transactional 方法提取到另一个类中,并将调用方代码保留在现有类中。
  2. 通过注入(inject) SessionFactory 手动创建 Session 对象,并创建一个 READ_ONLY 类型的事务。 (并删除 @Transactional 注释)

(如 Neo4j 用户 slack 中的回答)

关于java - 如何将自定义 Spring Data Neo4j 5.0.3 密码查询标记为只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48773539/

相关文章:

java - org.glassfish.grizzly.http.ajp.AjpHandlerFilter.encodeHttpPacket(AjpHandlerFilter.java :282) when using Apache as load balancer for GF 5

java - Spring Security - @PreAuthorize 返回 404

java - mvc :annotation-driven in dispatcher servlet configuration 内的冲突

javascript - 如何修复nodejs + neo4j中的 "connection was closed by sever"?

java - java中可以显式锁定/解锁对象上的隐式同步锁吗

python - 将 Neo4j 子图加载到 Networkx

neo4j - 在列表的连续元素之间创建关系

java - Spring 数据 Neo4j + Kotlin 上的日期转换器

neo4j - SDN 3.3.0 还是 SDN 4.0M1?

Neo4j Multi-Tenancy