为了在我的Neo4j SDN4应用程序中对数据进行语义化,我引入了totalChildDecisions
计数器:
@NodeEntity
public class Decision {
private Integer totalChildDecisions = 0;
}
@Override
@Transactional
public Decision create(String name, String description, String url, String imageUrl, boolean downloadImage, Long parentDecisionId, User user) {
Decision parentDecision = null;
if (parentDecisionId != null) {
parentDecision = lock(parentDecisionId, true);
}
decisionDaoValidator.validateDecisionAlreadyExistsByName(name, parentDecision);
description = HtmlUtils.sanitizeHTML(description);
Decision decision = createOrUpdate(new Decision(name, description, url, imageUrl, multiVotesAllowed, parentDecision, user), user);
if (downloadImage) {
updateImage(decision, imageUrl, downloadImage);
}
criterionGroupDao.create(CriterionGroupDaoImpl.DEFAULT_CRITERION_GROUP_NAME, null, decision, user);
characteristicGroupDao.create(CharacteristicGroupDaoImpl.DEFAULT_CHARACTERISTIC_GROUP_NAME, null, decision, user);
return decision;
}
lock
方法调用以下存储库方法:
@Query("MATCH (d:Decision) WHERE d.id = {decisionId} SET d._lock = {lock} RETURN d")
Decision lock(@Param("decisionId") Long decisionId, @Param("lock") boolean lock);
我正在增加totalChildDecisions
构造函数中的Decision
计数器:
public Decision(String name, String description, String url, String imageUrl, Decision parentDecision, User author) {
if (parentDecision != null) {
addParentDecision(parentDecision);
parentDecision.addChildDecision(this);
parentDecision.setTotalChildDecisions(parentDecision.getTotalChildDecisions() + 1);
}
}
createOrUpdate
调用repository.save
方法。
基于此代码,我将数据导入我的数据库。
现在我不明白为什么totalChildDecisions
与我Neo4j数据库中的真实子决策号不同(例如我有2000个孩子的决定,但是每个数据导入后的计数器显示不同的值...就像1998年,1995年等)。如何正确获取parentDecision
上的锁定以正确更新其totalChildDecisions
计数器?
已更新
此外,当用户从UI请求Decision.totalViews
时,我正在计算(增加额外的计数器)Decision
。我正在阅读本决定中的Decision
,增加totalViews
计数器并保存此决定。如果并行作业(在上面的问题中描述)同时更新totalChildDecisions
,我注意到我getDecision()
方法的长时间响应,因为该决定被另一个作业锁定{{1在此作业完成之前无法更新getDecision()
计数器。
考虑到这一点,最好更新totalViews
计数器异步(例如从totalViews
触发新事件并在ActiveMQ使用者处更新getDecision()
)阻止getDecision方法?