Спящий кеширование? - PullRequest
5 голосов
/ 22 июня 2011

Я использую Struts 2 и Hibernate. У меня есть простая таблица с полем Дата, в которой хранится информация о том, когда произошло определенное действие. Это значение даты отображается в моем JSP. У меня проблема в том, что после того, как hibernate обновляет базу данных, страница 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>

Я экспериментировал с evict Hibernate (), flush (). Я попытался добавить скриптлет (да, я знаю - скриплет - плохая практика):

<%
   response.setHeader( "Pragma", "no-cache" );
   response.setHeader( "Cache-Control", "no-cache" );
   response.setDateHeader( "Expires", 0 );
%>

Я немного застрял здесь - любая помощь приветствуется.

Спасибо, Дам

EDIT: У меня есть класс 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();
    }
}

Ответы [ 2 ]

4 голосов
/ 22 июня 2011

Но если я продолжу обновлять, тогда jsp покажет дату1 и в следующий раз дату2 и т. Д.

Я полагаю, вы имеете в виду, что при обновлении вывод переключается между устаревшими и свежими данными?

Если это так, это обычно вызывается сбоем закрытия и удаления сеанса Hibernate из вашего ThreadLocal. Большинство серверов приложений будут повторно использовать потоки из пула потоков для обработки запросов, поэтому, если старый сеанс не будет удален из ThreadLocal, он будет использован повторно и его контекст постоянства будет не синхронизирован с базой данных.

Убедитесь, что вы вызываете метод close() в своем классе DaoEngine до конца запроса. Вы, вероятно, должны установить и разорвать сеансы в фильтре сервлета или перехватчике Struts2.

0 голосов
/ 07 апреля 2014

Это переключение происходит, поскольку старый сеанс не удаляется из ThreadLocal. Это можно сделать двумя способами: 1. Добавьте session.close () до конца запроса. 2. Используйте пружинный управляемый класс, чтобы обрабатывать его автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...