Java .parallelStream() mit Feder annotierten Methoden

Ich versuche, mithilfe der parallelStream() in DAO mit Spring @Transactional Anmerkungen und bekommen so problem:

@Transactional
public void processCollection(Collection<Object> objects) {
    objects.parallelStream()
            .forEach(this::processOne);  //throw exception
}

@Transactional
public void processOne(Object o) {
    ...
}

Funktioniert richtig:

@Transactional
public void processCollection(Collection<Object> objects) {
    objects.stream()
            .forEach(this::processOne);  //work correctly
}

@Transactional
public void processOne(Object o) {
    ...
}

Ausnahme:

org.hibernate.HibernateException: No Session found for current thread
org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106)
org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:978)

Wie kann ich @Transactional annotierte Methoden von parallelStream()?

Update
Warum dies geschehen Spring transaction manager und multithreading
Aber ich hoffe, spring 4 mit java-8-Unterstützung kann auch eine Lösung für dieses. Irgendwelche Ideen?

  • Eine triviale Frage, aber bekommt man die gleiche Fehlermeldung, wenn Sie stream().parallel()?
  • Ja, ich habe das gleiche problem mit stream().parallel()
  • stackoverflow.com/questions/16835974/...
  • Danke Evgeni, ich verstehe, warum dies geschieht. Arbeit um für diese interessant ist.
  • Ich Frage mich, warum möchten Sie die @Transactional auf processCollection, wenn Sie wollen, um es zum laufen parallel.
  • Es ist nur Beispiel, Was passiert, wenn es '@Cacheable' Instanz von '@Transactional' ? Cache wird für die Arbeit nur ein thread, wie ich Sie verstehe..

InformationsquelleAutor VladS | 2014-04-24
Schreibe einen Kommentar