Я сохраняю сущность Node, которая содержит отношения с несколькими другими сущностями. Это сохранение отлично работает, когда я делаю это по одному, однако, если я запускаю это одновременно, я получаю NPE на org.neo4j.ogm.mapper.EntityGraphMapper
java.lang.NullPointerException: null
at org.neo4j.ogm.mapper.EntityGraphMapper.updateRelationship(EntityGraphMapper.java:618) ~[neo4j-ogm-1.1.2.jar:na]
at org.neo4j.ogm.mapper.EntityGraphMapper.mapRelationshipEntity(EntityGraphMapper.java:481) ~[neo4j-ogm-1.1.2.jar:na]
at org.neo4j.ogm.mapper.EntityGraphMapper.link(EntityGraphMapper.java:330) ~[neo4j-ogm-1.1.2.jar:na]
at org.neo4j.ogm.mapper.EntityGraphMapper.mapEntityReferences(EntityGraphMapper.java:265) ~[neo4j-ogm-1.1.2.jar:na]
at org.neo4j.ogm.mapper.EntityGraphMapper.mapEntity(EntityGraphMapper.java:158) ~[neo4j-ogm-1.1.2.jar:na]
Вот суть моей сущности Node:
@NodeEntity
public class Post {
@Relationship(type = "POST_BY_USER", direction = Relationship.INCOMING)
User poster;
@Relationship(type = "POST_TO_STORE", direction = Relationship.OUTGOING)
Store toStore;
@Relationship(type = "POST_PRODUCT", direction = Relationship.INCOMING)
Product product;
@Relationship(type = "POST_INSPIRATION", direction = Relationship.INCOMING)
Product_Inspiration productInspiration;
}
Я попытался сохранить как использование GraphRepository с (@Transactional), так и использование сеанса с транзакцией, в обоих сценариях я столкнулся с одной и той же проблемой с параллелизмом.
Может кто-нибудь, пожалуйста, дайте мне знать, как я могу решить эту проблему? Поскольку я получаю эту проблему, когда я бомбардирую одновременные запросы, я не уверен, что это может быть что-то с потоком кода как таковым.
В соответствии с просьбой Винса о коде, как отправлять одновременные запросы, я использую инфраструктуру axon cqrs с Play, и я отправляю несколько одновременных запросов в оставшийся API моего приложения Play, который через axon вызывает одновременную запись в Neo4j через метод postProduct. вот как выглядит мой код записи.
def postProduct(productId: ProductId, product2Post: Product2Post): Post = workNLogOnFail(
doPost(productId, product2Post),
"postProduct"
)
private def doPost(productId: ProductId, product2Post: Product2Post): Post = {
val product: Product = configureDomainEntity(productId, product2Post)
val storeId: StoreId = storeService1.findOrCreateStore(product2Post.host)
val post: Post = commonService.configurePost(product2Post.commonData2Post.relationInfo, isProduct = true) { (x: Post) =>
x.setToStore(storeService1.updateStoreForProductPost(x, storeId))
x.setProduct(product)
}
val persistedPost = xtPostProduct(product, post)
commonService.addUrlMapping(product2Post.commonData2Post, productId.identifier)
persistedPost
}
private def xtPostProduct(product: Product, post: Post): Post = {
Try {
val tx: Transaction = session.beginTransaction()
logger.debug(s"saving product")
// session.save(product)
logger.debug(s"updating user")
// session.save(post.getPoster)
logger.debug(s"posting product")
session.save(post)
tx.commit()
post
}.get
}
я попробовал @Transanctional с GraphRepository, а также сеанс в методе xtPostProduct.
doPost
каким-то образом не разделяет состояние между потоками и не спотыкается о себя. В частности, являются ли методыStoreService
иCommonService
, а такжеconfigureDomainEntity
потокобезопасными? - person Vince   schedule 17.09.2015