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

时间:2011-06-21 20:06:11

标签: java tomcat database-connection guice stripes

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

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

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

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

我有一个大型的Manager类连接,它们都为我的数据库中的各个表执行自定义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();
  }
}
}

2 个答案:

答案 0 :(得分:4)

  

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

总而言之,使用Servlet过滤器或Stripe Interceptor是实现每个请求模式的会话的一种常见方法(每个操作的会话确实是反模式)。虽然这并不意味着你需要在那里启动和停止交易。例如,您可以在操作bean中执行显式提交。

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

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

答案 1 :(得分:1)

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

然而,

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