我正在使用hibernate,spring,jpa。 在工作流程中,我更新了一個實體;但是這些更新在另一個工作流程中不可用。當我重新啓動服務器時,它工作正常。如何從Hibernate緩存中刪除實體
有沒有辦法讓我更新一個實體;我要求hibernate將它從它所擁有的任何緩存中刪除。因此,當任何其他工作流程需要該對象時,會創建一個新的查詢?
我正在使用hibernate,spring,jpa。 在工作流程中,我更新了一個實體;但是這些更新在另一個工作流程中不可用。當我重新啓動服務器時,它工作正常。如何從Hibernate緩存中刪除實體
有沒有辦法讓我更新一個實體;我要求hibernate將它從它所擁有的任何緩存中刪除。因此,當任何其他工作流程需要該對象時,會創建一個新的查詢?
這聽起來像你有兩個單獨的會話爲同一個應用程序,因此,有兩個1級緩存。第一級緩存是Hibernate在會話上下文中使用的緩存。所以,如果你沒有關閉/清除你的會話,這將會持續增長,可能與其他第一級緩存(在其他線程或其他虛擬機中)發生衝突。很難說如果是這樣的話,因爲你沒有指定你的環境,但你不能改變另一個會話的第一級緩存。
避免這種情況的最佳解決方案是使用受管理的EntityManager(來自您的應用程序服務器)來處理實體。這就是服務器的角色來處理這種情況。但是,您似乎正在採取「春季方式」,因此,您必須手動執行此操作:在使用它之後清除會話,或在讀取/更新數據之前進行刷新。然後,您需要某種鎖定(悲觀/樂觀),不會丟失可能已從其他線程更改的信息。
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-sessioncache 它有幫助嗎? – doniyor 2012-07-08 07:42:21
或此:http://stackoverflow.com/questions/474159/hibernate-second-level-cache-with-spring – doniyor 2012-07-08 07:45:01
我沒有使用二級緩存。另外,第一個註釋是關於evict方法的,它在JPA的Hibernate的EntityManager中是不可用的。 evict()適用於傳統的休眠。 – Deepak 2012-07-08 07:51:41