I try using the parallelStream()
in DAO with Spring @Transactional
annotations and get so problem:
@Transactional
public void processCo
The problem is not with parallel stream .In spring transaction is created using AOP.
When your processCollection method is executed spring create a proxy object of this and transaction is started.
Calling anyother method in same class ,spring will not run that method in New transaction even if you specified @Transaction .
To get it run move that method process() to new service and then execute your problem.your program will work fine.
Well, I have a guess consists of several guesses:
session-per-thread
;Object
you wrote in example is in fact some entity that uses lazy loading;processOne()
method uses entity properties that are loaded lazily;parallelStream()
has no session available (probably in ThreadLocal
, don't remember how technically sessions are bound to threads);That altogether causing the problem you have. The behavior looks quite strange to me, so I suggest to do the following:
parallelStream()
again;parallelStream()
.Alternative way to go: detaching all list elements from session before doing parallelStream()
.
Although as Marko wrote in comments, Session
is not thread-safe, so that means you have to get rid of Session
usage either by removing lazy loading, or by detaching all entities from session.