【问题标题】:Managing database connections with Stripes, Guice使用 Stripes、Guice 管理数据库连接
【发布时间】:2017-12-18 20:34:08
【问题描述】:

我想知道在 Stripes with Guice 中管理数据库连接的最佳实践。 理想情况下,我希望执行以下操作:

每个线程/http 请求使用一个 db 连接(可能使用 guice 将连接绑定到具有 ServletScope.REQUEST 范围的提供程序) 所有查询都在一个事务中执行,然后在最后提交或回滚。

我的问题是:什么应该创建/关闭我的数据库连接?

使用 Stripes 拦截器打开和关闭连接是不是一个坏主意?

我有一个管理器类的大型连接,它们都对我的数据库中的各种表执行自定义 SQL 查询。目前所有这些 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();
  }
}
}

【问题讨论】:

    标签: java tomcat database-connection guice stripes


    【解决方案1】:

    使用 Stripes 拦截器打开和关闭连接是不是一个坏主意?

    完全不,使用 Servlet 过滤器或 Stripe 拦截器是实现按请求会话模式的一种非常常见的方法(按操作会话确实是一种反模式)。尽管这并不一定意味着您也需要在那里开始和停止交易。例如,您可以在操作 bean 中进行显式提交。

    然而,对于注入 Stripes Action Bean,有比使用拦截器更优雅的方法。 web.xml 中的条带配置提供了一种使用ActionResolver.Class 参数配置您自己的Action Bean 工厂的方法。由于工厂确实实例化了 Action Bean,它还可以注入构造函数参数。自己实现这个并不难。

    但你不必自己实现,有一个出色的 Stripes 插件可以处理注入 Action Bean、Action Bean 上下文和拦截器:Stripes Guice。使用非常简单,见:how-to: guice managed action beans

    【讨论】:

      【解决方案2】:

      我们在使用 Stripes 拦截器来处理连接时遇到了一些问题——我认为这与拦截器有时在请求未通过 ActionBean 时不触发有关,尽管我记不清了。相反,我们最终编写了一个 Filter 来处理资源管理,而不是依赖于拦截器。

      Kdeveloper 是在正确的轨道上,但是,建议您使用 Guice 来构造您的 ActionBeans,而不是在它们上调用 injector.injectMembers()。我们为此使用stripes-guicer,它对我们来说效果很好。

      【讨论】:

        猜你喜欢
        • 2011-01-21
        • 2010-09-25
        • 1970-01-01
        • 2021-02-18
        • 2014-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多