3

StripeswithGuiceでデータベース接続を管理するために使用するベストプラクティスについて疑問に思っています。理想的には、次のことを強制したいと思います。

スレッド/httpリクエストごとに1つのdb接続が使用されます(おそらく、ServletScope.REQUESTスコープを使用してプロバイダーへの接続をguiceでバインドします)。すべてのクエリは1つのトランザクションで実行され、最後にコミットまたはロールバックされます。

私の質問は、データベース接続を作成/閉じるにはどうすればよいですか?

Stripes Interceptorを使用して接続を開閉するのは悪い考えですか?

データベース内のさまざまなテーブルに対してカスタムSQLクエリを実行するManagerクラスの大規模な接続があります。現在、これらすべてのManagerクラスには、次のようなメソッドがあります。

public abstract class MyManagerBase implements IMyManager {
  @Inject
  public void setConnection(Connection conn) {
    this.conn = conn;
   }
}

管理者自身がこれをサブクラス化し、接続を作成または閉じません。

私はこのようなアクションBeanを持っています:

public class MyActionBean implements ActionBean {
  @Inject IMyManager myManager;

  @DefaultHandler
  public Resolution save() {
    myManager.doStuff(...);
  }

  ...
}

私はこのようなguice設定を持っています:

public class MyConfigModule extends AbstractModule {

@Override
protected void configure() {

  install(new ServletModule());
  bind(IMyManager.class).to(MyManagerImpl.class);
  bind(Connection.class).toProvider(MyConnectionProvider.class).in(ServletScopes.REQUEST);
}    

これまでのところ、インターセプターを使用してマネージャーを注入すると同時に、そのhttpリクエストのすべてのマネージャーに同じ接続を使用することを考えています。

私のインターセプターの試みは、これまでのところ次のようになっています。

@Override
public Resolution intercept(ExecutionContext executionContext) throws Exception {
 Connection conn = null;

 switch( executionContext.getLifecycleStage() ) {
  case ActionBeanResolution:
    log.debug("Intercepting: ActionBeanResolution");
    // Inject dependencies into ActionBeans
    injector.injectMembers( executionContext.getActionBeanContext() );    
    Resolution resolution = executionContext.proceed();
    injector.injectMembers( executionContext.getActionBean() );

    return resolution;
  case RequestComplete:
    log.debug("Intercepting: RequestComplete");

    executionContext.getActionBean();

    Connection conn = injector.getInstance(Connection.class);

    conn.commit();
    conn.close();
  }
}
}
4

2 に答える 2

4

Stripes Interceptorを使用して接続を開閉するのは悪い考えですか?

いいえ、まったくありません。サーブレットフィルターまたはストライプインターセプターを使用することは、要求パターンごとのセッションを実装するための非常に一般的なアプローチです(操作ごとのセッションは実際にはアンチパターンです)。それはあなたがそこでもトランザクションを開始および停止する必要があることを意味する必要はありませんが。たとえば、アクションBeanで明示的なコミットを行うことができます。

ただし、Stripes Action Beanを注入する場合は、インターセプターを使用するよりも洗練された方法があります。web.xmlのストライプ構成は、パラメーターを使用して独自のActionBeanファクトリを構成する方法を提供しActionResolver.Classます。ファクトリは実際にアクションBeanをインスタンス化するため、コンストラクターパラメーターを挿入することもできます。これを自分で実装することはそれほど難しくありません。

ただし、これを自分で実装する必要はありません。アクションBean、アクションBeanコンテキスト、およびインターセプターの挿入を処理する優れたStripesプラグインがあります:StripesGuice。使い方はとても簡単です。参照:ハウツー:guiceマネージドアクションBean

于 2011-06-22T09:46:56.780 に答える
1

Stripesインターセプターを使用して接続を処理する際にいくつかの問題が発生しました。確かに覚えていませんが、リクエストがActionBeanを経由していないときにインターセプターが起動しないことが関係していると思います。代わりにFilter、インターセプターに依存する代わりに、リソース管理を処理するためのを作成することになりました。

ただし、 Kdeveloperは正しい方向に進んでおり、アクションBeanを呼び出す代わりに、Guiceを使用してActionBeanを構築することを提案してinjector.injectMembers()います。そのためにストライプガイサーを使用 しており、それは私たちにとってうまく機能しています。

于 2011-06-22T19:55:14.893 に答える