我正在使用一个自定义拦截器,该拦截器创建一个新的数据库连接,并在执行操作之前将该连接设置为当前操作。之后,拦截器将关闭连接。
我正在寻找一种与该操作使用的其他类/静态方法(例如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/