Hiberate with Struts2 - Использовать плагин Full Hibernate или другой метод для закрытия сессий?
Я использую 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 Plugin, а также подход Open Session in View.
Я предполагаю, что это распространенная проблема, и я хотел бы получить представление о наиболее часто используемом решении.
Еще я заметил, что плагин Full Hibernate поддерживает Struts 2.0.9+ до 2.1.6, но я использую 2.2.1.1. Не уверен, что это может быть проблемой, или если веб-сайт просто не был обновлен для отображения более новой версии.
Любой вклад очень ценится.
1 ответ
Я никогда не использовал плагин 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. Он использует тот же подход, но с фильтром сервлета.