在我的Spring Boot Webapp中,我有一个调度程序类@ enablesscheduling@EnableAsync在晚上运行@Scheduled。类正在获取一个会话:
Session session = entityManager.unwrap(Session.class);
导致以下异常:
org.hibernate.SessionException: Session is closed!
获取计划任务会话的正确方法是什么?
代码如下:
Session session = em.unwrap(Session.class);
Query query = session.createQuery("SELECT l FROM Lei l ORDER BY l.id");
query.setFetchSize(Integer.valueOf(1000));
query.setReadOnly(true);
query.setLockMode("a", LockMode.NONE);
// http://stackoverflow.com/questions/5067619/jpa-what-is-the-proper-pattern-for-iterating-over-large-result-sets
ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);
while (results.next()) {
Lei lei = (Lei) results.get(0);
writer.writeLEI(lei);
}
results.close();
session.close();
这是我刚刚创建的一个测试服务(我使用spring boot 1.4和所有默认配置):
@Service
public class ScheduledService {
@Autowired
private EntityManager entityManager;
@Async
@Scheduled(fixedRate = 500L)
@Transactional
private void reportCurrentTime() {
entityManager = entityManager.getEntityManagerFactory().createEntityManager();
Session session = entityManager.unwrap(Session.class);
System.out.println(session.hashCode());
}
}
然后我可以在控制台
中看到会话哈希码1410300721
966623925
181180995
1606490891
1882727729
635804073
1259672020
484131582
找到问题。愚蠢的我!I close the session
session.close ();