Hiberate with Struts2 - использовать Full Hibernate Plugin или другой метод для закрытия сессий - PullRequest
0 голосов
/ 05 мая 2011

Я использую Struts 2.2.1.1 и Hibernate 3.6.2.Final. Я также использую C3P0 для своего пула соединений, который работает на Tomcat 7.0.11.

У меня возникают проблемы, когда мои сеансы Hibernate не закрываются, и я быстро превышаю максимальное количество открытых подключений, настроенное в свойстве "hibernate.c3p0.max_size".

Я думаю, это потому, что мои Hibernate Sessions открыты, но никогда не закрываются. Я открываю сеансы из SessionFactory, которая хранится в ServletContext. Я попытался закрыть сессию в блоке finally {} в моем классе Action, но это вызывает исключения org.hibernate.LazyInitializationException.

Я провел небольшое исследование и нашел подход Full Hibernate , а также подход Open Session in View .

Я предполагаю, что это распространенная проблема, и я хотел бы получить представление о наиболее часто используемом решении.

Еще одна вещь, которую я заметил, - плагин Full Hibernate поддерживает Struts 2.0.9+ до 2.1.6, но я использую 2.2.1.1. Не уверен, что это может быть проблемой, или если веб-сайт просто не был обновлен для отображения более новой версии.

Любой вклад приветствуется.

1 Ответ

1 голос
/ 06 мая 2011

Я никогда не использовал плагин hibernate, но я бы посоветовал вам принять шаблон Open Session in View .Вы определенно хотите закрыть свои сеансы.

Один из наиболее распространенных способов справиться с этим - создать сеанс в начале запроса, сохранить его в локальном потоке, а затем закрыть в концезапроса.Это можно сделать с помощью перехватчика Struts или фильтра сервлетов.В основном:

public class HibernateSessionInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(final ActionInvocation invocation) throws Exception {
        try {
            // create the session and place it in the ThreadLocal
            return invocation.invoke();
        } finally {
            // close the session and remove it from the ThreadLocal
        }
    }
}

Если вы используете Google Guice, существует постоянный плагин (guice-persist), основанный на JPA.Он использует тот же подход, но с фильтром сервлета.

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