【发布时间】:2014-06-09 14:50:24
【问题描述】:
我尝试在带有 Spring @Transactional 注释的 DAO 中使用 parallelStream() 并遇到问题:
@Transactional
public void processCollection(Collection<Object> objects) {
objects.parallelStream()
.forEach(this::processOne); //throw exception
}
@Transactional
public void processOne(Object o) {
...
}
工作正确:
@Transactional
public void processCollection(Collection<Object> objects) {
objects.stream()
.forEach(this::processOne); //work correctly
}
@Transactional
public void processOne(Object o) {
...
}
例外:
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)
我如何使用@Transactional parallelStream() 注释的方法?
更新 为什么会发生这种情况Spring transaction manager and multithreading 但我希望支持 java 8 的 spring 4 可以为此提供一些解决方案。有什么想法吗?
【问题讨论】:
-
一个小问题,但是如果你使用stream().parallel(),你会得到同样的错误吗?
-
是的,我对 stream().parallel() 也有同样的问题
-
谢谢 Evgeni,我明白为什么会这样。解决这个问题很有趣。
-
我想知道当你想并行运行它时,为什么要在 processCollection 上使用@Transactional。
标签: java multithreading spring java-8 java-stream