Hibernate缓存?

dam*_*inc 5 caching hibernate struts2

我正在使用Struts 2和Hibernate.我有一个带有Date字段的简单表,该字段存储有关何时发生某个操作的信息.这个日期值显示在我的jsp中.我遇到的问题是,在hibernate更新db之后,jsp页面不会更新日期值.作为一个工作的例子:

date1 = 22/06/11 15:00:00 
date2 = 22/06/11 16:00:00
Run Code Online (Sandbox Code Playgroud)

当我手动刷新(F5)然后它没关系 - 日期值从更改date1date2(即从15:00到16:00).但是如果我继续刷新,那么jsp将一次显示date1,下一次显示date2,依此类推.我在hibernate.cfg中有以下内容:

<property name="hibernate.cache.use_second_level_cache">false</property>
<property name="hibernate.cache.use_query_cache">false</property>
Run Code Online (Sandbox Code Playgroud)

我试验了Hibernate的evict(),flush().我尝试添加一个scriptlet(是的,我知道 - scriptlets是不好的做法):

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

我有点卡在这里 - 任何帮助表示赞赏.

谢谢,达摩

编辑:我有一个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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*tez 4

但如果我不断刷新,那么jsp将一次显示date1,下次显示date2,依此类推。

我假设您的意思是当您刷新时,输出会在陈旧数据和新鲜数据之间切换?

如果是这样,这通常是由于未能从 ThreadLocal 中关闭和删除 Hibernate 会话而导致的。大多数应用程序服务器会重用线程池中的线程来处理请求,因此如果旧的 Session 没有从 ThreadLocal 中删除,那么它将被重用,并且其持久性上下文将与数据库不同步。

绝对确保您close()在请求结束之前调用 DaoEngine 类上的方法。您可能应该在 servlet 过滤器或 Struts2 拦截器中设置和拆除会话。

  • 每个请求一个新的会话实际上是最佳实践。:) (2认同)