2011-05-22 91 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緩存的寫得非常好且有用的文檔。