2015-02-06 118 views
0

我目前正在尝试在TimerTask(Runnable)中进行一个hibernate查询。该任务不保存或更新数据库。它只是检索一份工作清单。任何时候我运行这个任务,我得到HibernateException:无法找到当前的JTA事务。如何在timertask中管理hibernate事务?

我相信这与它从一个可运行的事件开始,因为我在这个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; 
    } 
} 

当可运行调用getJobs()时发生异常。这种方法在TimerTask之外的其他地方工作。

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

回答

0

我相信每个事务都有一些超时,所以你不能把正则计时器任务代码放在正在运行的事务中。因为它只是读取数据,你不会需要启动交易,只是会是足够

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

session = sessionFactory.openSession(); 

编辑

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

+0

我试着打开一个新的会话,但我仍然得到相同的异常。我不知道它是否相关,但run()并不直接调用DAO.getJobs()。它调用我创建的处理程序,然后调用DAO.getJobs()。 – mtanton 2015-02-06 15:36:19

+0

可否请您发布一些更相关的代码? – 2015-02-06 15:37:42

+0

添加了处理程序和dao代码。 – mtanton 2015-02-06 16:16:40