使用Stripes,Guice管理数据库连接

| 我想知道用于在带有Guice的Stripes中管理数据库连接的最佳实践。 理想情况下,我希望执行以下操作: 每个线程/ http请求使用一个数据库连接(可能是guice用ServletScope.REQUEST范围将连接绑定到提供程序) 所有查询都在一个事务中执行,然后在最后提交或回滚。 我的问题是:应该如何创建/关闭数据库连接? 使用Stripes Interceptor打开和关闭连接不是一个好主意吗? 我与Manager类有很大的联系,它们都对数据库中的各个表执行自定义SQL查询。当前,所有这些Manager类都具有如下方法:
public abstract class MyManagerBase implements IMyManager {
  @Inject
  public void setConnection(Connection conn) {
    this.conn = conn;
   }
}
管理者自己将其子类化,并且不创建或关闭连接。 我有这样的动作豆:
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();
  }
}
}
    
已邀请:
           使用Stripes Interceptor打开和关闭连接不是一个好主意吗? 一点也不没有,使用Servlet过滤器或Stripe Interceptor是实现每个请求模式的会话的相当普遍的方法(每个操作的会话确实是一种反模式)。尽管这不一定意味着您也需要在那里开始和停止事务。例如,您可以在操作bean中进行显式提交。 但是,用于注入Stripes Action Bean的方法要比使用拦截器更好。 web.xml中的条纹配置提供了一种使用
ActionResolver.Class
参数配置自己的Action Bean工厂的方法。当工厂实际实例化Action Bean时,它也可以注入构造函数参数。自己实现不是很困难。 但是您不必自己实现这一点,它有一个出色的Stripes插件,可以处理注入动作Bean,动作Bean上下文和拦截器:Stripes Guice。使用起来非常简单,请参阅:操作方法:guice托管动作bean     
        在使用Stripes拦截器处理连接时,我们遇到了一些问题-我认为这与在请求未通过ActionBean时有时不触发拦截器有关,尽管我不确定。相反,我们最终编写了一个“ 5”来处理资源管理,而不是依赖于拦截器。 但是,Kdeveloper步入正轨,建议您使用Guice构造ActionBean,而不要在它们上调用
injector.injectMembers()
。为此,我们使用了条纹导向器,对我们来说效果很好。     

要回复问题请先登录注册