我觉得可以是这样
  +--> 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模式都可以了。

解决方案 »

  1.   

    回:ggzzkk(蓝色的狮子)谢谢回复。你的方案似乎不错,看来切实可行。但,在我的实践中,似乎并未凑效。我原文中的“第二种尝试过的方法”就是用的一个普通的 Javabean ,它实现 singleton 模式,我在其他的项目中多次采用,屡试不爽。然而,试验的结果却是:另一次会话中,从 singleton 中取回的值完全是一个全新的值。这个结果也让我非常迷惑,通常的 singleton 在 EJB 环境下似乎失效了。我分析原因可能是因为 AppServer 采用了多个 classloader 的结构。多次会话之间,是多个 classloader ,而每一个 classloader 都实例化了一个自己的 singleton ,所以,实际上在内存中出现了 singleton 的多个实例。再次感谢,希望多多交流。
      

  2.   

    试验的结果却是:另一次会话中,从 singleton 中取回的值完全是一个全新的值。如果发生了更改,singleton的值当然是个全新的值了。singleton的实例是在多个会话中共享的。
      

  3.   

    设计上好象有些问题:
    util层用stateless不好,虽然避免了同步的问题,但是同时也失去了共享cached的能力。建议考虑stateful session bean,然后使用行集实现。(一点愚见)
      

  4.   

    to: ggzzkk(蓝色的狮子)
    或许是我解释得不够清楚,我的意思是这样的:
    “另一次会话”:另一个 client 的会话,服务器并未重启。
    “全新的值”:重新被初始化的值,比方,初始化的时候,赋值 null ,其他会话中给他设定了某个值,当前会话中取回的仍然是 null 。
    这个“普通 javabean singleton 方案”已经被证明是行不通的,因为 EJB container 大多会采用 multi-class-loader 结构(既使有不采用这种结构的 server ,原则上方案本身也不应依赖于特定的实现),这样的环境打破了 singleton 的存在基础。
    原因可以参考:http://developer.java.sun.com/developer/technicalArticles/Programming/singletons/to: buick555(王飞)
    谢谢回复。
    行集?恕我愚昧,没听过。能否详细解释?
      

  5.   

    刚刚看了ClassLoader的资料,我想singleton方案不行,是因为singleton是自己定义的类,classloader装载的时候不能确定由哪个层次的classloader装载。造成singleton实例的地址不一样。我想用static类的属性的方法也许可行。
    public class Maps
    {
      public static Map map;
    }
    这样尽管classloader装载的时候Maps实例的地址不一样,但Map是标准类,是由SystemLoader装载的,那样就同一地址共享了。水平有限,一点愚见,还请高手指教了。