我正在使用 Spring @Async
发出异步请求,我想知道,当我使用 @Async
时,如何将像休眠会话这样的豆子从一个线程传递到另一个线程?
问候。
您不能将休眠会话传递给另一个线程。某些 bean 连接到当前线程。活动数据库事务就是这样一个 Bean。Spring 将其保存在ThreadLocal
中,并且没有 API 将其传递给另一个线程。
您需要做的是将要处理的对象传递给新线程,在那里获取新会话并将对象em.merge()
到新会话中。或者,如果你想真正干净,你可以传递主键并从Hibernate再次加载对象。由于它们可能会在缓存中,因此这应该不是很昂贵。
只需在 ApplicationContext 中提供 bean 作用域,或者在声明 bean 的位置提供注释即可。如果 Bean 被多个线程使用,则无需执行任何显式操作即可复制范围