java - 使用 Stripes、Guice 管理数据库连接

标签 java tomcat database-connection guice stripes

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

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

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

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

我有一个很大的管理器类连接,它们都对我的数据库中的各种表执行自定义 SQL 查询。目前,所有这些管理器类都有如下方法:

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

管理者自己将其子类化并且不创建或关闭连接。

我有这样的 Action 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);
}    

到目前为止,我的想法是使用拦截器注入(inject)管理器,同时为该 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();
  }
}
}

最佳答案

Is it a bad idea to use a Stripes Interceptor to open and close the connections?

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

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

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

关于java - 使用 Stripes、Guice 管理数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431346/

相关文章:

java - Waffle Kerberos SSO - 模拟更改 tomcat 用户

由 Tomcat webapp 创建的文件以及所有者、所有者组、此文件的权限

php - CodeIgniter 数据库连接未关闭

java - 将 JScrollPane 锁定到 JTextArea 的底部(java swing)

java - 使用 String[] 调用 String... 函数

ruby - 如何配置 tomcat 以使用 jruby 处理 rhtml 页面?

ruby-on-rails - 我对控制台中收到的模型(调用 'Model.connection' 建立连接)消息感到困惑

java - 如何使用 EVP_Sign 函数计算签名

java - 如何使用 AlertDialog 从 Spinner 中删除项目

Android 我应该什么时候打开和关闭数据库连接?