2011-06-22 68 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.使用弹簧托管类自动处理切片。