当前位置: 技术问答>java相关
很基本的问题,关于实体Bean(也有我的看法)
来源: 互联网 发布时间:2017-03-10
本文导语: 关于实体Bean状态的问题。我的理解如下 比方说一个BMP,客户端调用时,lookup并且创建远程对象后, 在服务器端实例化一个Bean,处在一个pooled的状态(也可能不需要 客户端,只是容器觉得需要一个bean,那么这个过程...
关于实体Bean状态的问题。我的理解如下
比方说一个BMP,客户端调用时,lookup并且创建远程对象后,
在服务器端实例化一个Bean,处在一个pooled的状态(也可能不需要
客户端,只是容器觉得需要一个bean,那么这个过程就发生了。),
没有主键作为其标识,其状态与底层数据库同步。当调用一个finder/create
方法时候,则根据方法返回的主键创建/查找到相应的EJBObject,
当客户端调用某种方法比如getXXX的时候,容器回调ejbLoad方法,
真正的实例化bean,将主键所代表的纪录插入bean中。成为ready的状态。
当调用remove的时候,则该bean映射的纪录被删除,实例资源被释放,bean
重新进入pooled的状态。
当调用passviate方法时,容器将bean中的数据写入数据库,释放bean的资源
同样将bean踢入pooled状态。bean和EJBObject失去绑顶关系。
以上的状态,我不知道自己理解的是否正确。请高手指点。
另外我看到一些例子,并没有调用passivate方法,却是将远程对象置空,例如
一个远程接口是TestRemote,实例化为bean,在程序调用完之后bean = null;
这里有什么作用?为什么不调用passivate方法?
是否passivate只是为了处理客户端超时而用的回调方法?
另外,一个bean被remove之后,既然是进入pooled状态,也就是说,引用资源
并没有销毁,那么为什么不能重新调用;如果要销毁它的引用,该怎样?是否
是一个bean = null就可以了?
比方说一个BMP,客户端调用时,lookup并且创建远程对象后,
在服务器端实例化一个Bean,处在一个pooled的状态(也可能不需要
客户端,只是容器觉得需要一个bean,那么这个过程就发生了。),
没有主键作为其标识,其状态与底层数据库同步。当调用一个finder/create
方法时候,则根据方法返回的主键创建/查找到相应的EJBObject,
当客户端调用某种方法比如getXXX的时候,容器回调ejbLoad方法,
真正的实例化bean,将主键所代表的纪录插入bean中。成为ready的状态。
当调用remove的时候,则该bean映射的纪录被删除,实例资源被释放,bean
重新进入pooled的状态。
当调用passviate方法时,容器将bean中的数据写入数据库,释放bean的资源
同样将bean踢入pooled状态。bean和EJBObject失去绑顶关系。
以上的状态,我不知道自己理解的是否正确。请高手指点。
另外我看到一些例子,并没有调用passivate方法,却是将远程对象置空,例如
一个远程接口是TestRemote,实例化为bean,在程序调用完之后bean = null;
这里有什么作用?为什么不调用passivate方法?
是否passivate只是为了处理客户端超时而用的回调方法?
另外,一个bean被remove之后,既然是进入pooled状态,也就是说,引用资源
并没有销毁,那么为什么不能重新调用;如果要销毁它的引用,该怎样?是否
是一个bean = null就可以了?
|
你的理解有一些问题
首先一点,凡是回调方法客户是无法访问的,因为你根本没有bean类的引用,有的只是Home,Object接口的引用。只能调用接口暴露的方法。
另外,调用顺序问题
激活时:ejbActivate(连接资源)->ejbLoad(读取bean主键,并查找bean)
挂起时:ejbStore(存储bean主键,消除引用)->ejbPassivate(释放资源)
bean的remove操作将删除你的接口引用,bean的确是pooled状态,但使用它必须重新获得对Object接口的引用。
首先一点,凡是回调方法客户是无法访问的,因为你根本没有bean类的引用,有的只是Home,Object接口的引用。只能调用接口暴露的方法。
另外,调用顺序问题
激活时:ejbActivate(连接资源)->ejbLoad(读取bean主键,并查找bean)
挂起时:ejbStore(存储bean主键,消除引用)->ejbPassivate(释放资源)
bean的remove操作将删除你的接口引用,bean的确是pooled状态,但使用它必须重新获得对Object接口的引用。
|
我觉得你上面的看法基本上正确
不过好像客户端一般不能直接调用passivate,调用bean=null只是为了垃圾回收,而且passivate和释放引用是由容器决定的,前者当bean没有方法被调用时随时可能发生,后者是当容器觉得pool中实例太多或某些异常时释放一些。
remove时好像除了将记录从数据库中删除外,还解除了主键同远程接口对象的绑定,对象的身份没有了,因此不能调用。
不过好像客户端一般不能直接调用passivate,调用bean=null只是为了垃圾回收,而且passivate和释放引用是由容器决定的,前者当bean没有方法被调用时随时可能发生,后者是当容器觉得pool中实例太多或某些异常时释放一些。
remove时好像除了将记录从数据库中删除外,还解除了主键同远程接口对象的绑定,对象的身份没有了,因此不能调用。