Спящая стратегия загрузки - PullRequest
0 голосов
/ 03 мая 2011

Мы используем OpenSessionInView с нашим приложением Spring MVC. Я не уверен, как лучше справиться с этой ситуацией. В основном потому, что я не очень хорошо знаком с Hibernate. У нас есть 2 объекта, которые загружаются для каждой просматриваемой страницы. Давайте представим, что мы работаем над CMS. Таким образом, мы должны загрузить человека, который вошел в систему на каждой странице, и на каком сайте они в настоящее время работают. Во время нормального хода операций эти данные не изменяются.

У нас есть специальный перехватчик, который в основном выглядит следующим образом:

public class PersistenceInterceptor implements HandlerInterceptor {
    private PlatformTransactionManager transactionManager; //from spring
    private TransactionStatus transactionStatus;

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        this.transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
        if (handler instanceof SpecialInterface) {
           handler.setPerson(loadPersonByKey(session.getAttribute(PERSON_KEY)));
           handler.setSite(loadSiteByKey(session.getAttribute(SITE_KEY)));
        }
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //Wrapped in try catch & rolled back if unable to commit
        transactionManager.commit(transactionStatus);
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

        if (ex != null && !transactionStatus.isCompleted()) {
            transactionManager.rollback(transactionStatus);
        }
    }

Было бы лучше, если бы мы изменили способ, которым мы идем по этому поводу, и просто немного изменили его, чтобы использовать нашу сконфигурированную Hibernate sessionFactory для получения сеанса, а затем обновите человека и сайт - или мы все равно будем загружать эти значения?

Очевидно, что эти запросы не такие тяжелые, но бывают случаи, когда было бы полезно сохранить другие вещи, которые немного тяжелее, чтобы попытаться выгрузить работу из БД.

1 Ответ

3 голосов
/ 03 мая 2011

Если ваша цель - снять нагрузку с БД, то вам следует подумать об использовании кеша второго уровня. Поскольку одни и те же лица и сайты очень часто читаются и редко обновляются, кэш второго уровня для этих объектов очень хорошо подходит и эффективно сокращает количество загрузок этих объектов без необходимости что-либо менять в вашем коде.

См. http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/performance.html#performance-cache

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