Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 休眠缓存?_Hibernate_Caching_Struts2 - Fatal编程技术网

Hibernate 休眠缓存?

Hibernate 休眠缓存?,hibernate,caching,struts2,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将显示一次

我正在使用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>
但是如果我继续刷新,那么jsp将显示一次date1和下一次date2,以此类推

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

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


请确保在请求结束之前,您正在对DaoEngine类调用
close()
方法。您可能应该在servlet筛选器或Struts2拦截器中设置和删除会话。

由于旧会话未从ThreadLocal中删除,因此会发生此切换。这可以通过两种方式完成:- 1.在请求结束之前添加session.close()。
2.使用spring托管类自动处理Seision。

您使用什么机制来管理和清理Hibernate会话(或JPA实体管理器)?我听从了您的建议,读了一点,结果发现SeisionFactory.openSession()不是一个好主意。如果您使用它,那么您需要提供代码来管理会话(如下所述:。我很确定这是我的问题。我用getCurrentSession()替换了openSession()并且修改了一些代码。它现在可以工作了。但是!它并不完美-我为每个请求都会有一个新的会话,但这只是一个模拟项目,所以没关系。谢谢Steven!为每个请求创建一个新会话实际上是一个最佳实践。:)
<%
   response.setHeader( "Pragma", "no-cache" );
   response.setHeader( "Cache-Control", "no-cache" );
   response.setDateHeader( "Expires", 0 );
%>
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();
    }
}