相关疑难解决方法(0)

使用Spring Data和Hibernate时如何正确执行后台线程?

我正在构建一个使用Spring Data和Hibernate的简单Tomcat webapp.有一个终点可以完成很多工作,因此我想将工作卸载到后台线程,以便在完成工作时Web请求不会挂起10分钟以上.所以我在一个组件扫描包中写了一个新服务:

@Service
public class BackgroundJobService {
    @Autowired
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;

    public void startJob(Runnable runnable) {
         threadPoolTaskExecutor.execute(runnable);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后ThreadPoolTaskExecutor在Spring中配置:

<bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="5" />
    <property name="maxPoolSize" value="10" />
    <property name="queueCapacity" value="25" />
</bean>
Run Code Online (Sandbox Code Playgroud)

这一切都很有效.但问题来自Hibernate.在我的runnable中,查询只有一半工作.我可以:

MyObject myObject = myObjectRepository.findOne()
myObject.setSomething("something");
myObjectRepository.save(myObject);
Run Code Online (Sandbox Code Playgroud)

但是如果我有延迟加载的字段,它会失败:

MyObject myObject = myObjectRepository.findOne()
List<Lazy> lazies = myObject.getLazies();
for(Lazy lazy : lazies) { // Exception
    ...
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.stackoverflow.MyObject.lazies, could not initialize proxy - …
Run Code Online (Sandbox Code Playgroud)

java spring multithreading hibernate spring-data

13
推荐指数
1
解决办法
9074
查看次数

标签 统计

hibernate ×1

java ×1

multithreading ×1

spring ×1

spring-data ×1