关于在ejb中使用静态变量

虽然在ejb中不提倡使用静态变量,但在看sun的ejb模式中还是
看到了不少这样的例子
例如
http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html中用
private static HashMap classDataInfo = new HashMap();来做缓冲类数据。
我的问题是在集群的情况下classDataInfo能在不同的服务器的ejb之间共享吗,是不是每台机子中都有一个classDataInfo对象,如果是他们的数据是否相同?

public class TransferObjectFactory {

/**
* Use a HashMap to cache class information for
* Transfer Object classes
*/
private static HashMap classDataInfo = new HashMap();


这个是值对象工厂,用来保存对象信息用的... ...
文章要看明白,不要那么激动...

我知道阿
但集群中每个服务器中都会有一个静态变量classDataInfo对象,并且数据不相同。
可如何在分布式系统中实现单例呢

我没有详细看

对于singleton,那自然在集群里面每个机器上都存在咯
也是一摸一样的,自然就没有那个问题

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

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

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

这里是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;
}
}

集群里面每个机器上的一样不一样,对于这个系统是没有区别,我只是想搞清实际情况而已。

实际情况要根据实际讨论
你拿这个corej2eepattern来讨论,实际就是没有区别

呵呵

>每台机子中都有一个classDataInfo对象
是的,不可能每个JVM相同的。

如果你要使用全局变量这样的技术,Singelton单态也是帮不了你的,使用数据库是一种常用的选择。