3

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

每个线程/http 请求使用一个 db 连接(可能使用 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();
  }
}
}
4

2 回答 2

4

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

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

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

但是你不必自己实现,有一个优秀的 Stripes 插件可以处理注入 Action Bean、Action Bean Context 和拦截器:Stripes Guice。使用起来非常简单,请参阅:how-to: guice managed action beans

于 2011-06-22T09:46:56.780 回答
1

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

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

于 2011-06-22T19:55:14.893 回答