关于在ejb中使用静态变量

03-12-02 neutrino
虽然在ejb中不提倡使用静态变量,但在看sun的ejb模式中还是

看到了不少这样的例子

例如

http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html中用

private static HashMap classDataInfo = new HashMap();来做缓冲类数据。

我的问题是在集群的情况下classDataInfo能在不同的服务器的ejb之间共享吗,是不是每台机子中都有一个classDataInfo对象,如果是他们的数据是否相同?

         

crogers
2003-12-02 17:51
public class TransferObjectFactory {

/**

* Use a HashMap to cache class information for

* Transfer Object classes

*/

private static HashMap classDataInfo = new HashMap();

这个是值对象工厂,用来保存对象信息用的... ...

文章要看明白,不要那么激动...

neutrino
2003-12-02 18:14
我知道阿

但集群中每个服务器中都会有一个静态变量classDataInfo对象,并且数据不相同。

可如何在分布式系统中实现单例呢

crogers
2003-12-02 20:11
我没有详细看

对于singleton,那自然在集群里面每个机器上都存在咯

也是一摸一样的,自然就没有那个问题

而对于这里的static的这个东西,你可以看一下代码它是怎么初始化的

而对于ejb,一般的集群都支持stateful session,bmp,cmp的复制

我觉得问题的关键是,首先,集群是不是帮你复制?其次,集群不复制的话,那个东西是怎么创建的?很多情况下,很多东西不是复制过去的,而是集群上每个机器都有一个样的东西而已

crogers
2003-12-02 20:16
这里是classDataInfo使用的地方,集群里面每个机器上的一样不一样,是没有任何区别的

private static ClassData getClassData(String 
  className){

  ClassData cData = 
    (ClassData)classDataInfo.get(className);

  try {
    if (cData == null) {
      // Get the class of the given object and the 
      // Transfer Object to be created
      java.lang.reflect.Field[] arrFields ;
      java.lang.Class ejbTOClass = 
          Class.forName(className);

      // Determine the fields that must be copied
      arrFields = ejbTOClass.getDeclaredFields();

      cData = new ClassData(ejbTOClass, arrFields);
      classDataInfo.put(className, cData);
    }
  } catch (Exception e) {
    // handle exceptions here...
  }
  return cData;
  }
}

<p>

猜你喜欢
2Go 1 2 下一页