在Spring中集成的Quartz作业不会刷新Hibernate Session

时间:2014-10-13 16:07:01

标签: java spring hibernate quartz-scheduler

我在网络应用中使用 Hibernate Spring (在模式 OpenSessionInView 中)。

我已经引入 Quartz 来安排Job进行检查。 为了能够将bean注入作业,我使用了以下方法:https://gist.github.com/jelies/5085593

我的应用中的工作就像:

@Service
public class SampleJob implements Job {
  @Autowired
  private SampleBusiness sampleBusiness;

  @Override
  public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    for(Student student : sampleBusiness.getStudents()) {
      System.out.println(student.getName());
    }
  }    
}

当webapp启动时,在第一次执行Job时,结果为:

  • 汤姆
  • 布鲁斯
  • 史蒂芬

结果还可以。

之后,我在“Tommy”中更改了webapp的名称“Tom”。

在下次执行Job时,结果是:

  • 汤姆
  • 布鲁斯
  • 史蒂芬

为什么Hibernate会话保存旧数据?

我想我必须像对待我的其他豆子那样依附于Job一个拦截器,但是我无法将它附加到Job上。

由于

1 个答案:

答案 0 :(得分:0)

上述情况的可能原因可能是hibernate的缓存。

Hibernate使用两级缓存,1级缓存和2级缓存。 1级缓存会缓存经常读取的数据,但是如果hibernate缓存中没有数据,则它会在2级缓存中查找相同内容。

如果数据存在于缓存级别2中,则它返回数据,如果此处不存在数据,则它实际上会命中数据库以检索数据。

在尝试使用相同的方法之前,您应该尝试清除缓存数据。

虽然每当您从缓存数据更新记录时,都会重新缓存此数据。但是如果您尝试更新其他线程或会话中的数据,它可能不会反映在第一个线程中,因为数据已存在于此会话的1级缓存中。

我希望这会让你走向正确的方向。