为了与 DDD 和限界上下文保持一致,众所周知,当您创建微服务时,您应该保持关注点分离。
Neo4J 的主要好处之一是在 Neo4J 中保留“连接的”数据,以便有效地查询它们之间的关系。
当选择使用 Neo4J 时,这两种相反的力量似乎使微服务架构决策变得困难。
您是否有多个微服务连接到 Neo4J 数据库并相应地保留自己的域?
或者
您是否有一个微服务,具有与 Neo4J 的数据库连接来控制持久性和查询?
两者似乎都不太正确......
我目前正在开发一个Spring Data Neo4j 5.0.3 REST API应用程序,该应用程序与Neo4j 3.3.1因果集群连接,该集群包含3个核心节点(1个领导者和2个粉丝).无论好坏,我们还使用session.queryla SQL预处理语句向数据库提交了大量自定义cypher查询.当我们这样做时,我们注意到我们提交的自定义Cypher几乎都没有session.query被发送给任何只读的关注者.
我已经破解了代码并注意到,在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;
}
Run Code Online (Sandbox Code Playgroud)
isNewSessionHolder第一个分支中的第二个条件是什么意思?在单个HTTP API调用的上下文中,我们至少调用数据库2次,因此通过第二个查询,我相信这个条件总是返回false.
鉴于这些观察结果,是否有任何简单的方法可以使我的查询被视为只读?
版本:
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-core</artifactId>
<version>2.1.1</version>
</dependency>
<dependency> <!-- If you're using the HTTP driver -->
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-http-driver</artifactId>
<version>2.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-neo4j -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-neo4j</artifactId>
<version>4.2.0.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这是我的实体:
@Data
@NodeEntity
@EqualsAndHashCode(exclude = {"operatedByBuses"})
@ToString(of = {"name"})
public class BusStop {
@GraphId
private Long graphId;
@Index(unique = true, primary = true)
private String name;
private String pincode;
private String landmark;
private String[] latlong;
@Relationship(type = "OPERATED_BY")
private Set<OperatedByBus> operatedByBuses = new HashSet<>();
}
@Data
@RelationshipEntity(type = "OPERATED_BY")
@ToString(of = "displayName")
public …Run Code Online (Sandbox Code Playgroud) neo4j cypher spring-data-neo4j-4 neo4j-ogm spring-data-neo4j-5