hibernate 缓存?

标签 hibernate caching struts2

我正在使用 Struts 2 和 Hibernate。我有一个简单的表,其中包含一个日期字段,用于存储有关何时发生特定操作的信息。这个日期值显示在我的 jsp 中。
我遇到的问题是hibernate更新db后,jsp页面没有更新日期值。作为一个工作示例:

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

当我手动刷新 (F5) 时就可以了 - 日期值从 date1 更改至date2 (即从 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>

我尝试了 Hibernate 的 evict()、flush()。我尝试添加一个 scriptlet(是的,我知道 - scriptlet 是不好的做法):
<%
   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();
    }
}

最佳答案

But if I keep refreshing, then the jsp will once show date1 and next time date2 and so on.



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

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

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

关于 hibernate 缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6442131/

相关文章:

javascript - 当 Dojo 自动完成器的值发生变化时调用 java 脚本函数

java - 如何在 hibernate 中对关联表进行排序?

java - 使用 jpa2 和 hibernate 3.6.x 的生产实例的示例 persistence.xml

ios - IOS应用应该使用什么Cache方式

android - ner::ERR_CACHE_MISS Android 4.4 WebView

Android WebView 缓存

java - 访问静态方法时的 Struts 2 Action 线程安全

java - 从 Hibernate Annotations 切换到 hbm.xml 文件时出错

mysql - 如何在 hibernate 状态下检查连接

java - 尝试学习spring或struts框架的前提是什么?