2011-05-22 124 views
1

我的代码中有一个Hibernate实体。我会取这一点,基于属性的一个值,说“isProcessed”,继续下去:休眠脏对象的使用

  1. “isProcessed”的值更改为“是”(即我检查属性)
  2. 将一些任务添加到DelayedExecutor。

在我的性能测试中,我发现如果我锤起这个函数,会发生一个经典的脏读取场景,我向Executor添加了太多的任务,它们都会被执行。我不能使用基于任何东西检查队列中对象的相等性,我的意思是java只会执行所有添加的对象。

如何在使用hibernate的脏对象的东西能够检查“isProcessed”将任务添加到执行器之前?它会起作用吗?

希望我已经有足够的表现力。

+0

嘿那里...我的回答有帮助吗? aviad有一点关于人们欣赏被认可的贡献。 – stevevls 2011-05-24 08:53:15

回答

1

如果您可以使用同一会话执行所有查询来分派任务,那么您可能会将某些内容修补到一起。需要注意的是,您必须了解hibernate的缓存机制(是的,这是复数)是如何工作的。与会话关联的第一级缓存将成为这里的关键。此外,重要的是要知道,执行查询和保湿对象不会查看并从第一级缓存中返回对象......右手不会与左手交谈。

所以,要完成你想要做的事情(假设你可以继续使用相同的会话...如果你不能这样做,那么我认为你运气不好),你可以做以下:

  1. 执行查询
  2. 每个返回的对象,与Session的get方法
  3. 检查isProcessed标志和调度重新加载它,如果需要,是

通过调用得到的,你一定会得到obj从一级高速缓存中...等待挂起的所有脏对象。

对于背景,this是一篇关于hibernate缓存的写得非常好且有用的文档。