我在客户端的finally block里面调用了有状态会话bean的remove()保证了这个session bean在用完之后能够释放资源。
但是现在有一个问题,如果在客户端执行finally block之前 网络断了
1.server端的ejb container 会自动调用ejbRemove()方法吗?
2.这个原理是怎样的?
3.或者说应该在服务器端写一个方法来捕获一些超时异常,然后再调用ejbRemove()?
4.如果服务器会在一段时间后自动调用ejbRemove(),那么我的ejbRemove()方法里面不能是空的,对不对?那里边应该怎么写呢?

解决方案 »

  1.   

    1、EJB的容器管理机制包含资源回收事务处理,当你的session bean长时间没有被应用时,会序列化钝化于硬盘中,因此也就相当于自动调用remove,只是期间有个延迟过程。
    2、具体原理可以参照垃圾回收机制
    3、不需要捕获,EJB容器内置,见第一点
    4、服务器调用的REMOVE是针对与该客户端交互的SESSION BEAN ,因此不需要管。
      

  2.   

    嗯,我通过jmap -histo:live pid | grep *** 来检查资源占用情况。
    如果程序正常执行完的话,在服务器端执行完那条命令,资源占用为零。
    但是,在执行到builder.remove()之前把网线拔掉,过两个小时之后,再用相同的jmap命令检查,资源还是被占用着的,所以看起来那个延迟没有起作用。