在Spring Boot Scheduler中获取JPA会话



在我的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 ();

最新更新