Hibernate 休眠缓存?
我正在使用Struts 2和Hibernate。我有一个简单的表,其中有一个日期字段,用于存储有关某个操作何时发生的信息。此日期值显示在我的jsp中。 我遇到的问题是,在hibernate更新db之后,jsp页面不会更新日期值。作为一个工作示例: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将显示一次
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();
}
}