gpt4 book ai didi

hibernate 缓存?

转载 作者:行者123 更新时间:2023-12-04 20:21:09 28 4
gpt4 key购买 nike

我正在使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com