最佳实践:EJB: 从 EJB 会话 bean 访问 EJB 实体 bean
使用 EJB 会话 bean 访问 EJB 实体 bean。通过用会话 bean 包装实体
bean,您能获得更佳性能。这加强了通过活动的进程对象包装被动的数据实体对象这一有效的对象模型概念。然而,可以编写 EJB
客户机来直接访问实体 bean ,但是这样以性能为代价。通过用会话 bean 包装实体 bean 可以获得最佳性能。
读者:
开发人员
产品:
WebSphereApplication Server
版本:
3.0.2.x、3.5.x 和 4.0
平台:
所有
关键字:
Servlet、JSp 和 EJB
摘要
使用
EJB 会话 bean 访问 EJB 实体 bean。通过用会话 bean 包装实体
bean,您能获得更佳性能。这加强了通过活动的进程对象包装被动的数据实体对象这一有效的对象模型概念。然而,可以编写 EJB
客户机来直接访问实体 bean,但是这样以性能为代价。通过用会话 bean 包装实体 bean 可以获得最佳性能。
建议
避免从客户机或 servlet 代码访问 EJB 实体 bean。这个最佳实践满足了两个性能方面的问题:
一种更好的方法是从 EJB 会话 bean 访问 EJB 实体 bean。以下是 EJB 会话 bean 包装 EJB 实体 bean 的一个示例:
EJB 会话 bean 包装 EJB 实体 bean
import java.rmi.RemoteException; import java.security.Identity; import java.util.properties; import javax.ejb.*; import com.ibm.uxo.bestpractices.datamodels.*; public class EmployeeRosterBean implements SessionBean { private EmployeeHome employeeHome; private javax.ejb.SessionContext mySessionCtx = null; final static long serialVersionUID = 3206093459760846163L; public void ejbCreate() throws javax.ejb.CreateException, java.rmi.RemoteException { employeeHome = EmployeeEjbHomeCacheHelper.getEmployeeHome()} public EmployeeStruct getEmployeeInfoFor(String empno) { Employee theEmployee = null; EmployeeStructure returnValue = new EmployeeStructure(); try { theEmployee = employeeFindByprimaryKey(new EmployeeKey(empno)); returnValue.setSex(theEmployee.getSex()); returnValue.setSalary(theEmployee.getSalary()); returnValue.setphoneno(theEmployee.getphoneno()); returnValue.setMidinit(theEmployee.getMidinit()); returnValue.setLastname(theEmployee.getLastname()); returnValue.setJob(theEmployee.getJob()); returnValue.setHiredate(theEmployee.getHiredate()); returnValue.setFirstnme(theEmployee.getFirstnme()); returnValue.setEmpno(empno); returnValue.setEdlevel(theEmployee.getEdlevel()); returnValue.setComm(theEmployee.getComm()); returnValue.setBonus(theEmployee.getBonus()); returnValue.setBirthdate(theEmployee.getBirthdate()); returnValue.setWorkDept(theEmployee.getWorkdept()); } catch (Exception e) { e.printStackTrace(); } return returnValue; } public void ejbActivate() throws java.rmi.RemoteException {} public void ejbpassivate() throws java.rmi.RemoteException {} public voide ejbRemove() throws java.rmi.RemoteException {} } |
应被取代的方法
下列代码段说明了使用 servlet 从客户机代码直接访问 EJB 实体 bean。图 1显示了直接访问相对于使用 EJB 会话 bean 来包装 EJB 实体 bean 的性能影响。
EJB 实体 bean 的直接客户机访问
public class BpEmploymentServletV0 extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) { EmployeeHome employeeHome = null; Employe employee = null; try { ServletOutputStream out = response.getOutputStream(); employee = employeeHome.findByprimaryKey(new EmployeeKey(empno)); out.println(""); out.println(" "+employee.getFirstnme()+""); out.println(" "+employee.getLastname()+""); out.println(" "+employee.getSex()+""); out.println(" "+employee.getBirthdate().toString() + "); out.println(" "+employee.getEdlevel()+""); out.println(" "+employee.getJob()+""); out.println(" "+employee.getHiredate()+""); out.println(" "+employee.getWorkdept()+""); out.println(" "+employee.getphoneno()+""); out.println(" "+employee.getSalary.toString()+""); out.println(" "+employee.getComm().toString()+""); out.println(" "+employee.getBonus().toString()+""); out.println(""); } catch (Exception e) { e.printStackTrace(); } } } |
图 1. 将 EJB 实体 bean 包装在 EJB 会话 bean 内的性能影响