2009-12-11 68 views
2

我正在編程一個JSP/JSF Web應用程序並且當前使用的是Hibernate(和MySQL)庫。當我使用正在運行的應用程序更新數據時,一切正常。休眠:必須重新啓動Java應用程序才能實現數據

例子:我修改客戶信息

雖然如果我手動更改數據或手動添加在MySQL的條目,則變化不會對我的申請方有效。

問題:每一次,我都要重新加載應用程序。

任何人都可以理解我的問題並找到一個快速解決方案?

回答

0

可能Hiberante緩存已啓用,需要重新加載行/對象。

或者您應該通過Hibernate更新/插入數據。

+0

那麼問題是我們有一個本地應用程序和一個Web應用程序使用相同的數據庫。如果我使用軟件應用程序對數據庫進行了更改,則僅當頁面重新加載時才能在Web應用程序內更新數據。 (整個應用程序必須重新加載。)我沒有發現任何配置,我做了abot休眠緩存。 – wiooz 2009-12-11 20:00:50

1

您是否在您的Web應用程序中使用了second level cache?如果是這樣,你的選擇是:

  1. 使用集羣緩存(見上面鏈接選項)和遠程當你的本地應用程序,使對數據庫的修改使它無效。
  2. 在您的Web應用程序中公開一個必須調用的API(Web服務或甚至基本URL)(手動或通過您的「本地」應用程序)以使緩存失效。基本上,與#1相同,但更多的工作:-)所以只能在#1不適用的情況下使用。

如果你不使用二級緩存,但遇到了你所描述的問題,這意味着你持有到您的會話的時間太長了。會議應 generally be short-lived

+0

謝謝你的信息。我想我沒有在這個應用程序中使用任何緩存。例如,當我顯示不同的付款時,它應該只在我重新加載頁面時重新加載數據... Session session = SessionFactoryUtil.getInstance()。openSession(); (「SELECT * FROM factures INNER JOIN paiements ON paiements.id_facture = factures.id_facture WHERE factures.id_membre =」+ this.membre.getIdMembre()); query.addEntity(Paiements.class).addEntity(Factures.class); List paiements = query.list(); session.close(); – wiooz 2009-12-11 20:26:05

+0

您是否在等待您的頁面(會話等)中查詢結果?啓用hibernate SQL調試(http://docs.jboss.org/hibernate/stable/core/reference/en/html/session-configuration.html#configuration-optional),並檢查每次點擊頁面時確實執行了查詢。 – ChssPly76 2009-12-11 20:40:28

0

我不確定你是如何配置你的Hibernate會話的,但是一些配置要求你除了關閉會話外還要刷新會話(例如,能夠從底層JDBC連接斷開到DB的會話)。因此,在一個評論回覆,你說你結束工作,session.close(); - 嘗試這樣做:

session.flush(); 
session.close(); 

代替,看看是否可以修正你所看到的。

否則,我會檢查您是否確實沒有使用二級緩存......在您的休眠配置中明確禁用它,將hibernate.cache.provider_class設置爲org.hibernate.cache.NoCacheProvider

+0

OP運行查詢;沒有什麼可刷新的。以同樣的精神,查詢必須明確標記爲可緩存;如果沒有配置二級緩存提供程序,則不會有所作爲。 – ChssPly76 2009-12-11 21:21:59

0

閱讀其他的答案,這真的奇怪的意見。 您是否可以確認每次調用頁面時至少關閉一次Hibernate會話?你確定修改數據庫的其他應用程序確實提交了更改嗎?

相關問題