如何在定时器任务中管理休眠事务?

How do I manage hibernate transactions in a timertask?

我目前正在尝试在 TimerTask (Runnable) 中进行休眠查询。此任务不对数据库进行保存或更新。它只是检索作业列表。任何时候我 运行 这个任务,我都会得到 HibernateException: Unable to locate current JTA transaction.

我认为这与它是从 运行nable 启动的事实有关,因为我在这个 TimerTask 之外使用了相同的查询。

我不能分享我正在使用的代码,因为它是用于工作和专有的。我对这个问题的研究只真正让我找到了 Spring 的解决方案,但我无法使用 Spring 来完成这项工作。

我会尝试制作一些伪代码。

public class JobManager extends TimerTask {
    @Override
    public void run() {
        ...
        List<String> jobs = Handler.getJobs();
        ...
    }
}

public class Handler {
    public static List<String> getJobs() {
        return DAO.getJobs();
    }
}

public class DAO {
    public List<Object> getJobs() {
        try {
            session = HibernateManager.getSessionFactory().getCurrentSession();
            Query myQuery = session.createQuery("query string");

            List = myQuery.list();

        } catch(HibernateException he) {
            log.error(he);
        }

        return list;
    }
}

当运行nable 调用getJobs() 时出现异常。此方法适用于 TimerTask 之外的任何其他地方。

我知道这是有限的工作信息。如果需要,我可以尝试提供任何其他信息。

我相信每个交易都有超时时间,所以你不能把定时任务代码放在运行交易里面。因为它只是读取您不需要启动事务的数据,所以会话就足够了

我遇到了同样的问题,通过创建新会话解决了

session = sessionFactory.openSession();

编辑

session.getCurrentSession() 从当前线程获取当前会话,因此它不会在计时器任务中工作。使用 openSession()