我想应该是和网络有关系,毕竟生成entiy实例要占一些系统资源,如果通过网络那边的用户判断何时释放资源,没有通过本地session bean判断来的好,具体我也说不清楚,呵呵,学习!

解决方案 »

  1.   

    1、分离客户,服务层,既解偶。
    2、减少客户网络调用次数,即减少网络流量。
    3、包装实体BEAN异常,而非显示给客户端。
      

  2.   

    1.session bean的本质就是用来处理会话,所以处理用户的会话它当然优于enty bean
    2.由于它的本质,它可以跟踪客户信息,这些是enty bean 很难做到的,也没有必要.
    3.从分层的关系来说,session bean主要工作于业务逻辑层,而enty bean则接近于数据层,设计者的意图就是把操作与数据通过session bean 和 enty bean 分离开来拉
    4.至于网络流量的问题,一时没有想到有多大关系呵呵
      

  3.   

    其实就是减少了网络的连接。任何的远程调用,不论rmi,ejb,webservice,cobra底层都必须走socket,socket是个比较费时的操作。
    假设你有一个EntityBean(名为User)来处理一个User表(包括字段userId,userName,userPassword):
    不使用SessionBean做Facade:
    User的远程接口中必须有getUserId();getUserName();getUserPassword();等远程方法。客户端调用这些方法来获取数据库
        中某条数据的每个字段的值。现在假设客户端用ejbFindByPrimaryKey()方法定位到某条记录。为了得到这条记录的每个字段的
        数据,客户端不得不调用getUserId();getUserName();getUserPassword();这三个方法。由于这三个方法都是远程方法,所以每
        调用一个方法都会产生一个Socket连接。调用三个方法就要产生三次网络连接。如果表中的字段特别多的话,你为了取数据调用
        的远程方法就越多,网络开销就越大。
            此外,假设User有个关联的Bean叫做UserProperties。由于没有使用本地接口,所以关联属性也必须设置成远程接口的类型。
        这会使情况变得更糟。因为他们的关联信息通常是在ejbLoad和ejbStore方法中设置,而且当你在客户端调用getUserId(),getUserName()
        等方法的时候,容器为了同步bean和数据库底层数据,在调用bean实现类的相应方法之前会自动调用ejbLoad()和ejbStore()。由
        于其中涉及了关联Bean的查询,又是通过远程接口查询,这里又增加了网络操作。
      

  4.   


    使用SessionBean做Facade:
            首先你肯定要做一个Dto用来封装User表。客户端用Dto来和SessionBean交互。而SessionBean与EntityBean之间的操作完全
        通过本地接口去做。本地接口不会产生网络连接。当客户端希望得到表中一条记录的所有字段的值时,是由SessionBean通过本地
        接口调用getUserId();getUserName();getUserPassword();然后把值封装成一个Dto一次性返回给客户端。也就是说,客户端只要
        调用SessionBean中的一个远程方法(例如getUser())即可得到所有字段的值封装成的Dto,只产生了一次网络连接。
            并且采用这种模式后,关联属性可以使用本地接口类型,虽然关联信息可能还是在ejbLoad和ejbStore内部设置,但是完全使
        用本地接口,不会产生网络操作。
      

  5.   

    首先明确一点,只要你得到的数据量一定那么网络流量是基本相同的,所以基本不会减少数据流量。之所以提供性能正如 luckycat(潘鑫) 所说的,将实体bean的数据先打包,然后再使用会话bean进行粗粒度的访问,这样减少了每次访问数据的请求连接次数,一次请求传输的数据量大,这样可以节省很多服务器建立连接的性能消耗,所以提高了程序性能