0

この質問に関連しています(答えが実際には要点に達していない場合):

Struts2 で休止状態にする - 完全な休止状態プラグインまたは別の方法を使用してセッションを閉じますか?

私は同じセットアップをしています: 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)

コードのロジックの問題ですか、それともプラグインに関連する問題ですか? 後者の場合、構成の変更は役に立ちますか? プラグインをそのまま使用したいのですが、確実に動作しないか、データベースに関する私の理解が原始的すぎて、コードを書き直す必要があるのではないかと心配しています;-)。

4

1 に答える 1

1

さて、誰も答えを持っていないので、質問とコードをもう一度調べて、少しグーグルで検索しました。

  • 事実 1: プラグインは Struts 2.1.6 までしかサポートされていません。さらに、新しい Tomcat 7 を使用しているため、プラグインで何かが機能しない可能性があると推測しました。

  • 事実 2: Hibernate フォーラムの誰かが、新しいセッションを開く代わりにセッションにアクセスしようとすると、この問題が発生する可能性があると指摘しました: Hibernate Forum:Session is Closed! (底近くの解決策)

事実 1 が と のアノテーションを正しく機能させていないようです@session@transactionまたは、私の prepare メソッドで null であることが多いため、それらを間違って使用していたようです。

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

このクラスでは、これまで他のすべてのプロジェクト (Struts 2.1.6 および Tomcat 6) で通常機能していた次の注釈を使用しました。

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

prepare メソッドには、セッションが null かどうかをチェックし、それを現在の休止状態セッションに置き換える防御的なプログラミング コードがありました。問題は、このセッションがクローズされることが多かったことです。if (!session.isOpen())

したがって、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()プラグインのメソッドは Hibernate をopenSession()内部的に使用しているようです。したがって、これは Hibernate フォーラムからの実用的なソリューションのようです。さらに、struts2-fullhibernate-plugin が静的getNewSession()メソッドから取得したセッションとトランザクションを管理しているため、これは OpenSessionInView パターンを引き続きサポートします。補足として、私はできるだけ早く防御的プログラミングから例外をスローするように移行しようとしています;-)

これがあなたを助けることを願っています。

于 2011-06-10T07:13:57.610 に答える