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)然后它没关系 - 日期值从更改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>
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)
但如果我不断刷新,那么jsp将一次显示date1,下次显示date2,依此类推。
我假设您的意思是当您刷新时,输出会在陈旧数据和新鲜数据之间切换?
如果是这样,这通常是由于未能从 ThreadLocal 中关闭和删除 Hibernate 会话而导致的。大多数应用程序服务器会重用线程池中的线程来处理请求,因此如果旧的 Session 没有从 ThreadLocal 中删除,那么它将被重用,并且其持久性上下文将与数据库不同步。
绝对确保您close()在请求结束之前调用 DaoEngine 类上的方法。您可能应该在 servlet 过滤器或 Struts2 拦截器中设置和拆除会话。
| 归档时间: |
|
| 查看次数: |
1547 次 |
| 最近记录: |