NPE вызывается при отправке одновременных запросов на сохранение сущностей и отношений в Spring Data Neo4j 4

Я сохраняю сущность 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.


person Gaurav Abbi    schedule 16.09.2015    source источник
comment
Пожалуйста, не могли бы вы опубликовать здесь код, показывающий, как вы выполняете одновременную запись?   -  person Vince    schedule 17.09.2015
comment
Спасибо за код Гаурав. Я совсем не знаком с аксоном, но набор тестов для OGM содержит ряд тестов параллелизма. Это не значит, что у нас нет ошибок параллелизма, но мы их еще не нашли. Пожалуйста, не могли бы вы подтвердить, что метод doPost каким-то образом не разделяет состояние между потоками и не спотыкается о себя. В частности, являются ли методы StoreService и CommonService, а также configureDomainEntity потокобезопасными?   -  person Vince    schedule 17.09.2015


Ответы (1)


Догадаться. Проблема заключалась в том, что из-за весенней проводки DI мой сеанс или сеанс, используемый репозиториями, не был на единицу работы. Поскольку я вызываю операции базы данных через Axon, обычный способ использования сеансового компонента с областью действия «сеанс» не будет работать. Я вернулся к ручному созданию сеанса для каждого события Axon, которое мне нужно обработать. Так как по существу для меня это моя единица работы!!.

person Gaurav Abbi    schedule 17.09.2015