EJB Container是Enterprise java bean的执行环境,它通过EJB Server提供强大的系统级服务(system-level-services),程序员不需要自行去开发和维护这些属于系统层级服务的程序代码,它主要提供有Persistence、security、concurrency和transaction四项重要的系统服务。
Persistence-持久性
Persistence是Ejb Container为维护entity bean的字段变量和表记录间一致性所提供的一个服务机制。entity bean以对象的形式来展现数据库中的表记录,客户端可以通过访问entity bean的business方法来进行表记录的访问工作,以CMP(Container-managed persistence 容器管理持久性)的bean来说,EJB容器的持久性服务会自动维护entity bean的字段变量和表记录间的一致,随时保持字段变量内容是表里的最新记录和随时将变更后的字段变量内容写入表内。
在EJB1.x版中,每一个cmp的entity bean 都必须声明对应与于表字段的字段变量,而在JEJB2.x版以后则改为声明对应于表字段的字段访问方法,不管是字段变量还是字段访问方法,EJB容器都会自动维护entity和表记录间的一致性。
Concurrency 并发性
并发性是当多个客户端同时访问同一个资源时的情形。entity bean用来访问数据库中的表记录,而这些表记录是被其它客户端所分享的,同一个时间内经常会被多个客户端访问,对EJB容器来说,entity是共享的对象,客户端可能会访问到相同的entity bean,当两个客户端同时访问相同的EJB 对象时,为确保数据访问的正确性和有效性,ejb容器会自动维护entity bean 访问表的动作。比如说同步化entity bean 的business方法执行---当ClientA正在执行bean instance的business方法时,ejb容器会首先暂停ClientB(与A同时访问bean)的执行动作,待A执行完毕再执行B的business方法请求。session bean并不允许上述情形发生,以有状态session bean来说,一个session bean的bean instance只能服务一个客户端的请求,ejb容器会自动保留客户端和bean instance互动时的信息,因此多个客户端同时访问同一个bean instance的情形是不会发生的。而对无状态session bean来说,ejb容器并不会配置相同的bean instance来执行多个客户端的同时请求,且EJB容器也不会保留客户端和bean instance互动时的信息,所有没有访问相同 session bean instance的问题。
Transactions 事务性
transactions 是将多个数据库访问的语句包括在同一个区块内,只要其中有一个数据库访问的语句执行失败,那么已经执行的数据库访问命令都会被取消,所有已被变更的数据记录都会回退(rollback)到事务前的内容。ejb容器提供entity bean和session bean的事务的管理和控制,自动帮助bean实例建立和维护所需事务的执行环境,程序员只需通过bean的设计描述文档来设置每一个business方法所需要的事务属性,或通过应用程序服务器的EJB设计工具来设置它,ejb容器即会根据business方法个别的事务属性值,自动帮助bean instance建立和维护所需的事务执行环境,这种有EJBcontainer自动维护的事务称为container-manager transaction(CMT)。
除了CMT,ejb容器也提供了session bean和message-drive bean自行维护事务的弹性做法——bean-manager transaction(BMT),让程序员可以通过jdbc和JTA直接在bean class的business方法内编写事务的起始和结束的程序代码,这种方式是由business方法自行维护所需的事务环境,假如发生了事务失败,也由business方法决定是否要执行回退。
所有的bean都可以使用CMT,但是entity不能使用BMT。
Security 安全性
EJB容器亦提供Security的管理和控制,程序员可以设置访问bean方法的角色(role),只有经过EJB容器认可的客户端才可以访问和执行bean的方法。