2011-06-22 59 views
5

我正在使用Struts 2和Hibernate。我有一個帶有日期字段的簡單表格,用於存儲有關某個操作何時發生的信息。此日期值顯示在我的jsp中。 我遇到的問題是,休眠更新數據庫後,jsp頁面不會更新日期值。作爲一個工作示例:Hibernate緩存?

date1 = 22/06/11 15:00:00 
date2 = 22/06/11 16:00:00 

當我手動(F5)刷新那麼它的確定 - 日期值的變化從date1date2(即從15:00至16:00)。但是如果我保持清爽,那麼jsp將會顯示date1和next time date2等等。 我在hibernate.cfg如下:

<property name="hibernate.cache.use_second_level_cache">false</property> 
<property name="hibernate.cache.use_query_cache">false</property> 

我嘗試用Hibernate的逐出(),刷新()。我嘗試添加一個小腳本(是的,我知道 - 小腳本是不好的做法):

<% 
    response.setHeader("Pragma", "no-cache"); 
    response.setHeader("Cache-Control", "no-cache"); 
    response.setDateHeader("Expires", 0); 
%> 

我有點困在這裏 - 任何幫助表示讚賞。

感謝, 達摩

編輯: 我有一個DaoEngine類,我所有的DAO延伸。

public class DaoEngine 
{ 

    @SuppressWarnings("unchecked") 
    private static final ThreadLocal session = new ThreadLocal(); 
    private static final SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 

    protected DaoEngine() 
    { 
    } 

    @SuppressWarnings("unchecked") 
    public static Session getSession() 
    { 
     Session hibSession = (Session) DaoEngine.session.get(); 
     if (hibSession == null) 
     { 
      hibSession = sessionFactory.openSession(); 
      DaoEngine.session.set(hibSession); 
     } 
     return hibSession; 
    } 

    protected void begin() 
    { 
     getSession().beginTransaction(); 
    } 

    protected void commit() 
    { 
     getSession().getTransaction().commit(); 
    } 

    @SuppressWarnings("unchecked") 
    protected void rollback() 
    { 
     try 
     { 
      getSession().getTransaction().rollback(); 
     } 
     catch (HibernateException e) 
     { 
     } 
     try 
     { 
      getSession().close(); 
     } 
     catch (HibernateException e) 
     { 
     } 
     DaoEngine.session.set(null); 
    } 

    @SuppressWarnings("unchecked") 
    public static void close() 
    { 
     getSession().close(); 
     DaoEngine.session.set(null); 
    } 

    public void clearAll() 
    { 
     getSession().clear(); 
    } 
} 
+1

您使用什麼機制來管理和清理Hibernate會話(或JPA實體管理器)? –

回答

4

但是,如果我保持清爽,那麼JSP將再次顯示日期1和下一次DATE2等。

我假設你的意思是,當你刷新時,輸出是在陳舊和新鮮的數據之間切換?

如果是這樣,通常是由於無法關閉並從ThreadLocal中刪除Hibernate會話而導致的。大多數應用程序服務器將重用線程池中的線程來處理請求,因此如果舊的會話未從ThreadLocal中刪除,那麼它將被重用,並且其持久化上下文將與數據庫不同步。

請確保您在請求結束之前在您的DaoEngine類中調用了close()方法。您應該設置並拆除servlet過濾器或Struts2攔截器中的會話。

+0

我遵循你的建議,閱讀了一下,事實證明seesionFactory.openSession()不是一個好主意。如果你使用它,那麼你需要提供代碼來管理會話(如下所述:[會話和事務](http://community.jboss.org/wiki/SessionsAndTransactions#Transaction_demarcation_with_plain_JDBC「會話和事務」)。我很確定這是我的問題,我用getCurrentSession()替換了openSession(),並更改了一些代碼,但它現在可以工作了,但它並不完美 - 我爲每個請求都獲得一個新會話,但這只是一個模擬項目,所以沒關係,謝謝Steven! –

+2

每個請求的新會話實際上是最佳做法。:) –

0

由於舊會話未從ThreadLocal中刪除,因此發生切換。這可以通過兩種方式完成: - 1.在請求結束之前添加session.close()。 2.使用彈簧託管類自動處理切片。