指穷于为薪,火传也,不知其尽也。—《养生主》

Daily English:Experience must be bought.

用静态变量还是ServletContext?

今天在写代码的时候突然冒出这个奇怪的想法=。=……

先说明一下现在的状况:

我们的b/s系统是jsp的,里面有一种“表码表”,里面存放的是一些需要经常使用而且比较少发生改变的内容,表码表是一些Map对象,而这些表码表会存放在jsp的ServletContext中。

初始化的大致代码如下:

Language:  Java
class SysInit  extends HttpServlet implements ServletContextListener{
  public void contextInitialized(ServletContextEvent sce) {
    Map myTablePool= new HashMap();
    servletContext = sce.getServletContext();
    //往myTablePool里面塞数据
    ...
    servletContext.setAttribute("m1",myTablePool);
    ...
  }
}

然后在需要调用这些表码表的那些BO类中从request的serveletContext中获取,再进行操作:

Language:  Java
class MyBO {
  public MyBO(HttpServletRequest req){
    Map myTablePoo l= (Map) req.getSession().getServletContext.getAttribute("m1");
    //然后就开始使用myTablePool里面的操作
  }
}

可是,今天在写BO类的时候突然想起来,这样子的做法和我在BO类里设置一个静态的私有变量有什么区别??
下面是我假想的代码,首先还是我的SysInit类:

Language:  Java
class SysInit  extends HttpServlet implements ServletContextListener{
  public void contextInitialized(ServletContextEvent sce) {
    servletContext = sce.getServletContext();
    MyBO.init();//调用BO类的静态方法,初始化BO里的静态私有变量
    ...
  }
}

这是我的BO类:

Language:  Java
class MyBO {
  private static Map myTablePool = null;//我的静态表码表池
  public MyBO(){
    //先判断一下myTablePool是否为空……
    //测试过,除非initPool抛错,没对myTablePool初始化,否则不会为空
    if (myTablePool == null){
      initPool();
    }
    //直接操作myTablePool里面的数据
  }
 
  public static initPool(){
    myTablePool = new HashMap();
    //往myTablePool里面塞数据
    ...
  }
}

最早设计这套系统,使用ServletContext的家伙早就跳槽另谋高就,另外找了几个人问,都没有比较令人满意的答复,最多就是说静态变量放在内存里,如果web容器里跑的另外一个应用程序中也有一个同名的静态变量,会发生冲突……

谁能给我一个比较好的解释:类里的静态变量比较好,还是在全局的ServletContext里放着比较好?

分享家:Addthis中国

Leave a comment for: "用静态变量还是ServletContext?"

*

Tag Cloud