2016-04-04 51 views
0

現狀:爲什麼我是EntityManager的獲取過時的數據庫對象

  • 應用一個
  • 應用B(Java獨立,計劃的批處理作業加載數據(在一個Tomcat 7,REST接口的Web應用程序運行的戰爭)從文件到數據庫)
  • 在共享控制表與每個文件的記錄之間。
  • 應用程序A正確地在控制表中保留新記錄並設置適當的狀態(掛起),從而發信號通知應用程序B開始處理。
  • Web應用程序正確顯示狀態爲掛起狀態。
  • 應用程序B處理該批次,加載數據並正確設置新狀態(已處理),表示加載已完成。這很容易通過使用fx Squirrel進行簡單的查詢來驗證。
  • 在Web應用程序中刷新頁面時,狀態會錯誤地顯示爲掛起而不是正確的狀態:已處理。調試響應時,狀態變量被分配爲待處理狀態。我的日誌表明查詢發生在刷新上。
  • 如果我重新啓動Tomcat,下一個查詢將顯示正確的結果,即正在處理的狀態。這也令我困惑,除了EntityManager維護數據庫對象之外呢?

問題: 我只是不知道爲什麼應用程序A繼續看到狀態爲掛起。我已經嘗試了很多事情來確保entityManager已經清除了緩存(對於App A和App B),但App A查詢仍然會得到錯誤的狀態。

+0

是否在每次更新/插入App A/App B時刷新EntityManager並刷新實體? –

+0

提交事務應刷新。因爲我所有的插入/更新都在事務中運行,並且真正的:-)狀態可以通過fx Squirrel輕鬆驗證。 – MMA

回答

0

@Baldurian 感謝提示。我在獲取的對象上添加了一個刷新,並且它工作。我通過一個子對象獲得我的狀態。原來,即使應用程序A在每次查詢之前都清空了緩存,該子對象也從未刷新過。不完全是我期待的行爲。

0

EclipseLink默認保持second level cache,它位於EntityManager之外,爲什麼清除EntityManager緩存沒有幫助。

您可以像上面提到的那樣進行刷新,但是這需要知道什麼時候進行了更改,以便知道何時需要刷新 - 並且在刷新刷新時需要注意更改。

如果您要經常在此JPA應用程序之外進行更改,最好在某些或所有實體上禁用共享緩存。 <property name="eclipselink.cache.shared.default" value="false"/>屬性可用於爲所有實體禁用它,或者您可以選擇性地使用@Cache註釋挑選

相關問題