Struts2 + Full Hibernate Plugin -> Сессия закрыта? - PullRequest
0 голосов
/ 09 июня 2011

Связанный с этим вопросом (где ответ на самом деле не доходит до сути):

Hiberate with Struts2 - Использовать плагин Full Hibernate или другой метод для закрытия сеансов?

У меня такая же настройка: Struts 2.2.3 и struts2-fullhibernatecore-plugin-2.2.2-GA.У меня нет ни одного из значений по умолчанию, измененных для Struts2 и для плагина.Я использую MySQL, никаких дополнительных пулов соединений и вообще ничего особенного.

Я использую следующий код в своем действии:

FeedGroup persistent = null;
List<FeedGroup> list = objectList = (List<FeedGroup>) session.createCriteria(FeedGroup.class)
        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
        .list();
if (feedgroup.getId() != 0) // a new one
{
    persistent = (FeedGroup) session.get(FeedGroup.class, id);
}
if (persistent != null)
{
    persistent.copyValuesFromOther(feedgroup);
    session.update(persistent);
}
else
    session.save(feedgroup);

return list;

Это дает мне следующее исключение только в каждых 10 случаях или около того , что не происходит в моем коде, но вероятно после того, как плагин совершил транзакцию.

org.hibernate.SessionException: Session is closed!

org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72)
org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1346)
abelssoft.newspaper.actions.ActionHelper.prepare(ActionHelper.java:65)
com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:167)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
java.lang.Thread.run(Thread.java:619)

Это проблема в логике моегокод или это проблема, связанная с плагином?Если последнее, может ли помочь изменение конфигурации?Я хотел бы использовать плагин в том виде, в каком он есть, я просто беспокоюсь, что он не работает надежно или что мое понимание баз данных слишком примитивно и что мой код требует переписывания; -).

1 Ответ

1 голос
/ 10 июня 2011

Хорошо, поскольку никто не получил ответа, я снова посмотрел на вопрос и код и немного погуглил.

  • Факт 1: плагин поддерживается только до Struts 2.1.6, кроме того, я использую новый Tomcat 7, поэтому я предположил, что что-то может просто не работать с плагином.

  • Факт 2: Кто-то на форуме Hibernate указал, что эта проблема может возникнуть, если вы попытаетесь получить доступ к сеансу вместо открытия нового : Hibernate Forum: Session is Закрыто! (раствор внизу)

Кажется, что факт 1 приводит к тому, что аннотации @session и @transaction работают неправильно, или я их неправильно использовал, поскольку они часто были нулевыми в моем методе prepare, который является таким классом и из которого все Мои действия в Struts2 получены:

public abstract class ActionHelper extends ActionSupport implements Preparable, ...

В этом классе я использовал следующие аннотации, которые обычно работали во всех других проектах (Struts 2.1.6 и Tomcat 6):

@SessionTarget
Session db;
@TransactionTarget
Transaction transaction;
private FeedGroupDAO _feedGroupDao;

В методе prepare у меня был защитный программный код, который проверял, был ли сеанс нулевым, а затем заменял его текущим сеансом гибернации. Проблема заключалась в том, что этот сеанс часто закрывался, что вы можете узнать, если спросите if (!session.isOpen())

Поэтому теперь я использую следующий код в своем методе prepare в классе ActionHelper:

    public void prepare() throws Exception {
    // initialize DAO Objects with Session and Transaction

    if (session == null)
    {
        session = com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getNewSession();
        if (!session.isOpen())
            throw new NullPointerException("Fix the code: session's not here");

        transaction = session.beginTransaction();
    }
    _feedGroupDao = new FeedGroupDAO(session,transaction); // init more DAOs with the same session/transaction

Метод плагина getNewSession(), похоже, использует внутреннее значение openSession() Hibernate, поэтому, похоже, это рабочее решение форумов Hibernate. Кроме того, он по-прежнему поддерживает шаблон OpenSessionInView, поскольку Struts2-fullhibernate-plugin управляет сеансом и транзакцией, полученными из статического метода getNewSession(). В качестве заметки я стараюсь как можно скорее перейти от защитного программирования к созданию исключений; -)

Надеюсь, это поможет вам.

...