Hibernate Dirty Object用法

时间:2011-05-22 18:14:44

标签: java hibernate

我的代码中有一个Hibernate实体。我会获取它,并根据其中一个属性的值,说“isProcessed”,继续和:

  1. 将“isProcessed”的值更改为“是”(我检查的属性)
  2. 向DelayedExecutor添加一些任务。
  3. 在我的性能测试中,我发现如果我敲击这个函数,就会发生一个经典的脏读事件,并且我向Executor添加了太多任务,所有这些任务都将被执行。我不能使用基于任何东西检查队列中对象的相等性,我的意思是java只会执行所有添加的对象。

    如何在将任务添加到执行程序之前使用hibernate的脏对象来检查“isProcessed”?会有用吗?

    希望我表达得足够好。

1 个答案:

答案 0 :(得分:1)

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

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

  1. 执行您的查询
  2. 对于每个返回的对象,使用Session的get方法
  3. 重新加载它
  4. 检查isProcessed标志并在需要时发送
  5. 通过调用get,您将确保从第一级缓存中获取对象...其中所有待处理的脏对象都被保留。

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