如何在定时器任务中管理休眠事务?
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()
我目前正在尝试在 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()