我正在使用一个自定义拦截器,该拦截器创建一个新的数据库连接,并在执行操作之前将该连接设置为当前操作。之后,拦截器将关闭连接。

我正在寻找一种与该操作使用的其他类/静态方法(例如Models)共享此数据库连接的便捷方法。例如,所以我可以调用User.get( id )User.getEmail( id )之类的静态方法,而不必将db连接分别传递给每个方法。

我可以通过以下操作将数据库连接设置为从拦截器到ActionContext

ServletActionContext.getActionContext().put("db", db );

然后,我可以从静态方法访问此数据库连接,例如:

public class User implements Model
{
   public static String getEmail(int id)
   {
      Connection db =
         (Connection) ServletActionContext.getActionContext().get("db");
      //...
   }
}


我的问题是,是否会为每个给定请求生成一个新的ActionContext,所以我可以确定每次都会使用一个新的数据库连接?例如,如果我有500个人访问mysite.com/fooAction,是否可以确定这500个请求中的每个请求都生成一个唯一的ActionContext,并且对User.getEmail()的每个调用都只能访问给定请求所独有的数据库连接?

谢谢。

最佳答案

我的问题是,是否会为每个给定生成新的ActionContext
  请求,因此我可以确保每个数据库都会使用一个新的数据库连接
  时间?


由于ActionContext使用ThreadLocal,所以它是线程安全的。 Struts 2为每个请求创建一个ActionContext,每个请求都有自己的线程。因此,是的,如果您创建一个新的连接并将其存储在ActionContext中,则每个线程都将拥有自己的连接。但是我不建议您将连接存储在ActionContext中,因为这会使您与Struts 2耦合,这不是一件好事,而且您的服务也不应调用特定于Web的类,因为它也会将它们耦合。

From Struts 2 Javadoc:


  ActionContext是在其中执行动作的上下文。每
  上下文基本上是动作需要的对象容器
  执行,例如会话,参数,语言环境等。
  
  ActionContext是线程本地的,这意味着值存储在
  每个线程的ActionContext是唯一的。看到
  有关更多信息,请参见ActionContext.ActionContextThreadLocal类。的
  这样做的好处是您不必担心特定于用户的情况
  动作上下文,就可以了:
  
  ActionContext上下文= ActionContext.getContext();最后,因为
  您不必担心线程本地使用情况
  动作线程安全。


ActionContext摘录:

public class ActionContext implements Serializable {

    static ThreadLocal<ActionContext> actionContext = new ThreadLocal<ActionContext>();
    ....
}

关于java - Struts 2中的ActionContext是当前请求唯一的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19437095/

10-11 02:32