2012-02-15 257 views
0

我有一個Spring/JPA/Hibernate應用程序,並且有一段代碼被石英作業每分鐘調用一次以發送一些通知。春季休眠不更新實體

@Transactional 
public void sendNotifications(){ 
    Set<MyEntity> entitySet = getDAO().findEntitiesToNotify(); 
    for (MyEntity e : entitySet) { 
     sendEntityNotificationEmail(e); 
     e.setNotification(true); 
     this.merge(e); 
    } 
    return false; 
} 

這在大部分時間都可以正常工作。關鍵短語是「大部分時間」,因爲有時這個事務不會更新數據庫,所以每分鐘都會發送通知電子郵件,直到我手動執行並終止石英作業或更新數據庫爲止。日誌中沒有錯誤,數據庫也沒有更新。有沒有人對這個問題有什麼想法?或者我可以調試這個問題的任何方式。是否有一些競爭條件發生,因爲這種方法每隔一分鐘就調用一次,所以一個新線程再次調用同一個任務,而另一個正在處理它,因此這個改變不會持久?

+1

如何void方法返回布爾?似乎你在發佈問題時忘記了一些細節。 – 2012-02-15 08:20:36

+1

爲什麼合併而不保存更新? – Firo 2012-02-15 11:05:50

+1

爲什麼合併而不是持續?最終會使用「flush()」,寫更多的代碼 – darek 2012-02-15 13:51:13

回答

0

它可以更好地在其他線程發送通知不是再次從數據庫中獲得實體,更新實體狀態並保存