我觉得可以是这样
+--> sessionfacade(sessionbean stateful remote)
|
+--> util(sessionbean stateless local )
|
+--> javabean
|
+--> entity(entitybean local)在stateless session和entity直接加个普通的javabean,用它来做缓存,用stateless session从entity把数据取出来放在javabean里,然后供stateful sessionbean来使用。
这样直接在javabean中加个static map或使用Singleton模式都可以了。
+--> sessionfacade(sessionbean stateful remote)
|
+--> util(sessionbean stateless local )
|
+--> javabean
|
+--> entity(entitybean local)在stateless session和entity直接加个普通的javabean,用它来做缓存,用stateless session从entity把数据取出来放在javabean里,然后供stateful sessionbean来使用。
这样直接在javabean中加个static map或使用Singleton模式都可以了。
util层用stateless不好,虽然避免了同步的问题,但是同时也失去了共享cached的能力。建议考虑stateful session bean,然后使用行集实现。(一点愚见)
或许是我解释得不够清楚,我的意思是这样的:
“另一次会话”:另一个 client 的会话,服务器并未重启。
“全新的值”:重新被初始化的值,比方,初始化的时候,赋值 null ,其他会话中给他设定了某个值,当前会话中取回的仍然是 null 。
这个“普通 javabean singleton 方案”已经被证明是行不通的,因为 EJB container 大多会采用 multi-class-loader 结构(既使有不采用这种结构的 server ,原则上方案本身也不应依赖于特定的实现),这样的环境打破了 singleton 的存在基础。
原因可以参考:http://developer.java.sun.com/developer/technicalArticles/Programming/singletons/to: buick555(王飞)
谢谢回复。
行集?恕我愚昧,没听过。能否详细解释?
public class Maps
{
public static Map map;
}
这样尽管classloader装载的时候Maps实例的地址不一样,但Map是标准类,是由SystemLoader装载的,那样就同一地址共享了。水平有限,一点愚见,还请高手指教了。