Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复随机NPE和;Neo.ClientError.Statement.EntityNotFound“;并行执行多个Neo4j CRUD操作时?_Java_Spring_Neo4j_Junit4_Spring Data Neo4j 4 - Fatal编程技术网

Java 如何修复随机NPE和;Neo.ClientError.Statement.EntityNotFound“;并行执行多个Neo4j CRUD操作时?

Java 如何修复随机NPE和;Neo.ClientError.Statement.EntityNotFound“;并行执行多个Neo4j CRUD操作时?,java,spring,neo4j,junit4,spring-data-neo4j-4,Java,Spring,Neo4j,Junit4,Spring Data Neo4j 4,我使用的是Spring数据neo4j-4,为了验证我的服务层的行为,我运行了多个Junit测试,在各种neo4j节点上执行域(CRUD)操作,并创建和删除关系。这些操作和测试互不依赖。我偶尔会在不同的测试中遇到这个错误 org.neo4j.ogm.session.result.ResultProcessingException: "errors"[{"code":"Neo.ClientError.Statement.EntityNotFound","message":"Node with id

我使用的是Spring数据neo4j-4,为了验证我的服务层的行为,我运行了多个Junit测试,在各种neo4j节点上执行域(CRUD)操作,并创建和删除关系。这些操作和测试互不依赖。我偶尔会在不同的测试中遇到这个错误

org.neo4j.ogm.session.result.ResultProcessingException: "errors"[{"code":"Neo.ClientError.Statement.EntityNotFound","message":"Node with id 24213"}]}
[error]     at      org.neo4j.ogm.session.response.JsonResponse.parseErrors(JsonResponse.java:165)
[error]     at org.neo4j.ogm.session.response.JsonResponse.next(JsonResponse.java:101)
[error]     at org.neo4j.ogm.session.response.JsonResponse.next(JsonResponse.java:30)
[error]     at org.neo4j.ogm.session.response.GraphRowModelResponse.next(GraphRowModelResponse.java:52)
[error]     at org.neo4j.ogm.session.response.GraphRowModelResponse.next(GraphRowModelResponse.java:32)
[error]     at org.neo4j.ogm.session.response.SessionResponseHandler.loadByProperty(SessionResponseHandler.java:55)
[error]     at org.neo4j.ogm.session.delegates.LoadByTypeDelegate.loadAll(LoadByTypeDelegate.java:81)
[error]     at org.neo4j.ogm.session.delegates.LoadByTypeDelegate.loadAll(LoadByTypeDelegate.java:109)
[error]     at org.neo4j.ogm.session.Neo4jSession.loadAll(Neo4jSession.java:158
有趣的是,这种情况发生在随机测试场景中。我已经确保在不同的测试和设置中使用不同的新会话。服务类创建自己的会话。但这一切似乎都无济于事

这是驱动程序或弹簧层的问题还是neo4j本身的问题?有什么建议可以帮助解决这个问题

NPE:

    <failure message="Error mapping GraphModel to instance of com.mylivn.neo4j.domain.User"         type="org.neo4j.ogm.metadata.MappingException">org.neo4j.ogm.metadata.MappingException: Error mapping GraphModel to instance of com.mylivn.neo4j.domain.User
at          org.neo4j.ogm.mapper.GraphEntityMapper.mapEntities(GraphEntityMapper.java:97)
at org.neo4j.ogm.mapper.GraphEntityMapper.map(GraphEntityMapper.java:69)
at org.neo4j.ogm.session.response.SessionResponseHandler.loadByProperty(SessionResponseHandler.java:60)
at org.neo4j.ogm.session.delegates.LoadByTypeDelegate.loadAll(LoadByTypeDelegate.java:81)
at org.neo4j.ogm.session.delegates.LoadByTypeDelegate.loadAll(LoadByTypeDelegate.java:109)
at org.neo4j.ogm.session.Neo4jSession.loadAll(Neo4jSession.java:158)
at com.mylivn.neo4j.services.utils.Neo4jHelper.getByUuid(Neo4jHelper.scala:39
Caused by: java.lang.NullPointerException
at org.neo4j.ogm.entityaccess.DefaultEntityAccessStrategy.getPropertyWriter(DefaultEntityAccessStrategy.java:77)
at org.neo4j.ogm.entityaccess.DefaultEntityAccessStrategy.getPropertyWriter(DefaultEntityAccessStrategy.java:47)
at org.neo4j.ogm.mapper.GraphEntityMapper.writeProperty(GraphEntityMapper.java:145)
at org.neo4j.ogm.mapper.GraphEntityMapper.setProperties(GraphEntityMapper.java:138)
at org.neo4j.ogm.mapper.GraphEntityMapper.createRelationshipEntity(GraphEntityMapper.java:272)
at org.neo4j.ogm.mapper.GraphEntityMapper.mapRelationshipEntity(GraphEntityMapper.java:233)
at org.neo4j.ogm.mapper.GraphEntityMapper.mapRelationships(GraphEntityMapper.java:197)
at org.neo4j.ogm.mapper.GraphEntityMapper.mapEntities(GraphEntityMapper.java:95)
... 79 more
org.neo4j.ogm.metadata.MappingException:将GraphModel映射到com.mylivn.neo4j.domain.User实例时出错
在org.neo4j.ogm.mapper.GraphEntityMapper.mapEntities上(GraphEntityMapper.java:97)
位于org.neo4j.ogm.mapper.GraphEntityMapper.map(GraphEntityMapper.java:69)
位于org.neo4j.ogm.session.response.SessionResponseHandler.loadByProperty(SessionResponseHandler.java:60)
位于org.neo4j.ogm.session.delegates.LoadByTypeDelegate.loadAll(LoadByTypeDelegate.java:81)
位于org.neo4j.ogm.session.delegates.LoadByTypeDelegate.loadAll(LoadByTypeDelegate.java:109)
位于org.neo4j.ogm.session.Neo4jSession.loadAll(Neo4jSession.java:158)
位于com.mylivn.neo4j.services.utils.Neo4jHelper.getByUuid(Neo4jHelper.scala:39
原因:java.lang.NullPointerException
位于org.neo4j.ogm.entityaccess.DefaultEntityAccessStrategy.getPropertyWriter(DefaultEntityAccessStrategy.java:77)
位于org.neo4j.ogm.entityaccess.DefaultEntityAccessStrategy.getPropertyWriter(DefaultEntityAccessStrategy.java:47)
位于org.neo4j.ogm.mapper.GraphEntityMapper.writeProperty(GraphEntityMapper.java:145)
位于org.neo4j.ogm.mapper.GraphEntityMapper.setProperties(GraphEntityMapper.java:138)
位于org.neo4j.ogm.mapper.GraphEntityMapper.createRelationshipEntity(GraphEntityMapper.java:272)
位于org.neo4j.ogm.mapper.GraphEntityMapper.maprerelationshipEntity(GraphEntityMapper.java:233)
位于org.neo4j.ogm.mapper.GraphEntityMapper.maprerelationships(GraphEntityMapper.java:197)
在org.neo4j.ogm.mapper.GraphEntityMapper.mapEntities上(GraphEntityMapper.java:95)
…还有79个
更令人费解的是NPE失败。正如我所看到的代码,如果请求来自一个线程,除非另一个线程从propertyWriterCache中删除该条目,否则它不应该失败。 这似乎不是线程安全的,但我没有看到任何从propertyWriterCache中删除条目的代码

从中抛出NPE的代码

@Override
public EntityAccess getPropertyWriter(final ClassInfo classInfo, String propertyName) {
if(!propertyWriterCache.containsKey(classInfo))
{ propertyWriterCache.put(classInfo,new HashMap<String, EntityAccess>()); }
if(propertyWriterCache.get(classInfo).containsKey(propertyName))
{ //*line77* return propertyWriterCache.get(classInfo).get(propertyName); }
MethodInfo setterInfo = classInfo.propertySetter(propertyName);
EntityAccess propertyWriter = determinePropertyAccessor(classInfo, propertyName, setterInfo, new AccessorFactory<EntityAccess>() {
@Override
public EntityAccess makeMethodAccessor(MethodInfo methodInfo)
{ return new MethodWriter(classInfo, methodInfo); }
@Override
public EntityAccess makeFieldAccessor(FieldInfo fieldInfo)
{ return new FieldWriter(classInfo, fieldInfo); }
});
propertyWriterCache.get(classInfo).put(propertyName, propertyWriter);
return propertyWriter;
}
@覆盖
public EntityAccess getPropertyWriter(最终ClassInfo ClassInfo,字符串propertyName){
如果(!propertyWriterCache.containsKey(classInfo))
{propertyWriterCache.put(classInfo,new HashMap());}
if(propertyWriterCache.get(classInfo.containsKey)(propertyName))
{//*line77*返回propertyWriterCache.get(classInfo.get(propertyName);}
MethodInfo setterInfo=classInfo.propertySetter(propertyName);
EntityAccess propertyWriter=确定属性访问器(classInfo、propertyName、setterInfo、new Accessor Factory(){
@凌驾
公共实体访问makeMethodAccessor(MethodInfo MethodInfo)
{返回新的MethodWriter(classInfo,methodInfo);}
@凌驾
公共实体访问makeFieldAccessor(FieldInfo FieldInfo)
{返回新的FieldWriter(classInfo,fieldInfo);}
});
获取(classInfo).put(propertyName,propertyWriter);
返回属性编写器;
}

我在频繁使用Session.save()保存一个节点时遇到同样的问题。我认为根本原因是调用Session.save()时, NodeEntity的相关修改对象(包括关系、RelationshipEntity和路径)将再次保存,因此当场景中多个案例并行运行时,会导致数据异步

最后,我用保存RelationshipEntity替换了保存修改后的NodeEntity。这暂时解决了问题。希望对您有所帮助


注意:这不是最好的解决方案。

我经常使用Session.save()保存一个节点时遇到同样的问题。我认为根本原因是调用Session.save()时, NodeEntity的相关修改对象(包括关系、RelationshipEntity和路径)将再次保存,因此当场景中多个案例并行运行时,会导致数据异步

最后,我用保存RelationshipEntity替换了保存修改后的NodeEntity。这暂时解决了问题。希望对您有所帮助


注意:这不是最好的解决方案。

错误来自Neo4j本身,但在不知道您的各个会话和线程是如何相互操作的情况下,很难确定根本原因。如果一个事务创建了一个节点,而另一个事务在提交第一个事务之前尝试读取它,您可能会设置此错误。因此,如果您的读/写事务在不同的线程上运行,但共享状态,则很容易发生无序操作。这是我首先要看的地方。我使用org.springframework.data.neo4j.template.neo4joOperations#save保存/创建实体。正如我在文档页面中回忆的,模板保存方法provides自动提交事务。我是否需要专门创建一个事务并在save调用返回后提交?不,您不需要显式创建事务-save将如您所说自动提交。您是否在不同的线程上调用Neo4jTemplate?不,对于给定的测试,我使用session/s和r创建一组实体在另一个会话中取消我的服务。这都是在一个线程中完成的。许多这样的设置-->测试序列并行运行。错误来自Neo4j本身,但在不知道您的各个会话和线程是如何相互操作的情况下,很难确定