2008年12月3日星期三

JavaEE_006:会话Bean的生命周期 (摘录+整理)

客户会话(Client Session)的持续期决定了使用中的会话Bean的存活期,这就是术语“会话Bean”的来源。

1. 无状态会话Bean的生命周期

(1)在不同方法调用间不保留任何状态,即每次方法调用结束后,Bean实例都不记得曾经被调用过。
(2)无状态会话Bean不会“专门”地保存客户端的状态。
(3)无状态会话Bean实例池中的Bean实例都是“众生平等”的,每次调用时,都会从池中“随机”选择一个Bean实例来服务客户。
(4)需要传递方法执行过程中需要的所有参数。

2. 有状态会话Bean的生命周期

(1)可以在不同的方法调用间保持针对各个客户端的状态 。
(2)有状态会话Bean会保存客户端的状态。
(3)有状态会话Bean实例池的实现比无状态会话Bean实例池要复杂得多。
因为有状态会话Bean需要保存特定客户端的状态,一个客户端对应一个实例,即使在客户端没有任何请求时,也要为这个客户端保留这个实例。
这样随着客户端数量的增加,EJB容器创建的实例的数量也在增加,超过某个值之后,EJB容器将不再创建新的实例。虽然不创建新的实例,还是要响应用户请求的。
那么,EJB容器是如何做到的呢?它采用的是共享实例的策略。
EJB容器会查看哪个实例虽然处于连接状态(一般根据是最近最少使用原则 Least Recently Used:LRU),但是没有访问,然后把这个实例的状态保存起来,使用这个实例为新的请求服务,对于原来的客户端来说,称为挂起(Passivation)。
如果原来的客户端又发送请求了,会重新查找一个空闲的实例并且把已经保存好的状态恢复回来,这个过程称为激活(Activation)。
(4)不需要传递方法执行过程中需要的所有参数。

3. 生命周期回调
有些时候,当EJB容器创建和管理会话Bean实例时,你可能需要“介入”会话Bean的管理过程。
例如,你可能想在创建会话Bean实例的时候初始化字段变量、获得某些资源,或者在销毁会话Bean实例的时候释放某些资源。
上述这些,你都可能通过生命周期的回调来实现。这些方法将会被EJB容器在生命周期的不同阶段调用。
在EJB 3.0中,会话Bean可以有任意数量,任意名字的回调方法。
(1)@PostConstruct:在Bean类完成实例化后,EJB容器会立即调用此方法。比如给成员变量赋值。适用于有状态和无状态的会话Bean。
(2)@PreDestroy:在结束对@Remove方法调用之后,销毁Bean实例之前,EJB容器会立即调用此方法。比如释放分配给该Bean的所有资源。适用于有状态和无状态的会话Bean。
(3)@PrePassivate:在挂起Bean前,EJB容器会立即调用此方法。比如释放Bean实例持有的资源。只适用于有状态的会话Bean。
(4)@PostActivate:在激活Bean实例后,EJB容器会立即调用此方法。比如重新获得Bean实例在@PrePassivate期间释放的资源。只适用于有状态的会话Bean。
(5)@Init:初始化有状态Bean的方法。与@PostConstruct的区别在于:多个@Init注释方法可以同时存在于有状态Bean中,但每个Bean实例只会有一个@Init的方法会被调用,这取决于Bean是如何创建的。@PostConstruct在@Init之后被调用。
(6)@Remove:销毁有状态会话Bean实例的方法。只适用于有状态的会话Bean。

JavaEE_005:使用JDevloper 11g 开发EJB3.0(摘录+整理)

EJB3.0使用POJO风格的编程模型,这是与传统EJB最大的不同。

1. 创建一个Stateless Session Bean
参见 http://www.oracle.com/technology/products/jdev/11/cuecards/tech_set_34/ccset34_ALL.html

2. 创建一个Stateful Session Bean

3. 创建一个JPA Entities
参见 http://www.oracle.com/technology/products/jdev/11/cuecards/j2ee_set_11/ccset11_ALL.html
如何使用Hibernate作为O-R Mapping的底层实现?

4. 创建一个Message Driven Bean

2008年12月2日星期二

JavaEE_004: JPA是个啥东东?(摘录+整理)

【ORM】:Object-relational mapping 对象关系映射。
把关系数据库中的数据与面向对象的语言中的数据互相进行转换。
【JPA】:Java Persistence API Java持久化API。
作为EJB3.0规范的一部分,JPA 提供了标准的ORM解决方案。
该解决方案定义了服务提供者接口(SPI),开发者不用修改实体代码,就可以使用不同的持久化提供者(如 Hibernate、Toplink、OpenJPA)。
JPA既可以在EJB容器内使用,也可以在Java SE中使用。

JPA包括以下三方面的技术:
(1)ORM映射元数据:JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; ?
(2)一套操作API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。 ?
(3)一套查询语言:使用面向对象而非面向数据库的查询语言查询数据,避免使用SQL语句。

JavaEE_003: EJB3.0 性能调优 (摘录+整理)

Java EE应用中导致性能问题的罪魁祸首就是远程调用,这是分布式应用不可避免的问题。
分布式应用是运行在多个VM(Web容器、Servlet容器、EJB容器、数据库...)中的,这些VM可能分布在不同的机器上,即使在同一台机器上,也需要在不同的VM之间通讯。

1. 使用会话外观(Session Facade)访问实体(JPA实体或实体Bean)
直接访问实体的效率相当低下,需要经过:存根、骨架、Marshaling/Demarshaling、网络调用、EJB对象拦截器。

2. 如果客户端和EJB组件运行在同一个JVM中(如Web客户端),使用本地接口。
本地接口避免了按值传递对象,而是按引用传递对象(省略了序列化和反序列化的过程)。
本地接口虽然避免了远程调用的开销,但与同一个JVM中两个普通Java类之间的通讯相比,客户端还是要通过EJB 容器来调用EJB对象。

至于远程接口,一般只用在如下场合:
(1)需要通过远程访问(比如 远端Web客户端,独立的Java客户端)。
(2)使用独立的Java客户端测试EJB组件。
(3)集群环境,使用远程接口选择更多。比如为了负载均衡、容错。

3. 区分哪些是EJB特定的资源,哪些是独立于EJB的资源。
(1)EJB特定的资源:仅供特定EJB对象的EJB实例使用。
在创建(@PostConstruct)或激活(@PostActivate)EJB实例时获得该资源;
在销毁(@Remove、@PreDestroy)或挂起(@PrePassviate)EJB实例时释放该资源。
(2)独立于EJB的资源:供多个EJB对象的EJB实例使用,创建一次即可,多次重复使用。

4. 无状态会话Bean调优
(1)调整实例池大小:最小值满足系统正常运转,最大值满足系统高峰期运转。设置过大,浪费资源;设置过小,需要频繁创建和销毁大量对象。
(2)有效缓存资源:Just-in-Time策略,需要时才从连接池及时获取连接,用完后立即归还给连接池。

5. 有状态会话Bean调优
(1)调整实例池大小:某些EJB容器事先会创建实例化的、但未同客户绑定的、不含有会话状态的Bean对象。当需要时,EJB容器会从池中取出Bean对象,并初始化它,然后将它绑定到特定客户上。如果EJB容器提供了这类池,可以对池进行调优。
(2)调整缓存大小:当客户并发数超过了有状态会话Bean实例的上限时,EJB容器会强制缓存(挂起)一些有状态会话Bean实例,以便让腾出的有状态会话Bean实例服务其他客户。某些EJB容器支持不同的挂起算法(LRU、FIFO、NRU);还允许指定有状态会话Bean实例空闲多少时间后,挂起它;以及被挂起的有状态会话Bean实例多长时间内未激活,删除它。
(3)有效控制序列化:序列化会消耗CPU和I/O资源。反序列化(激活有状态会话Bean实例时),同样耗费资源。我们可以用Java transient关键字显式告诉EJB容器不要序列化哪些信息。

6. 实体调优
(1)调整实例池大小:调整原则与无状态会话Bean相同。
(2)调整缓存大小:调整原则与有状态会话Bean相同。
其它缓存建议:
(i)为经常使用的实体提供较大缓存,为很少使用的实体提供较小缓存。
(ii)将缓存大小和实例池的最大值设为一样。
(iii)实体的实例池和缓存大小通常都比无状态和有状态会话Bean大得多。例如:一个会话Bean一个finder方法就会返回大量的实体。
(3)使用延迟装载:客户不需要访问实体的所有数据时,可以考虑延迟装载。
(4)选择正确的事务语义。
(5)选择正确的事务隔离级别。
(6)获取大量数据时,建议使用会话Bean + JDBC,不要使用实体。
(7)为Entity Manager 选择合适的RDBMS驱动。
(8)选择正确的Statemant接口。

7. MDB调优
(1)调整实例池大小:调整原则与无状态会话Bean相同。
(2)JMS相关调优。

2008年12月1日星期一

JavaEE_002: EJB3.0是个啥东东?(摘录+整理)

【EJB】:Enterprise Java Bean。
EJB技术是为了分布式企业级应用而生的。
一个EJB是一个可重用的、可移植的Java EE组件。
在MVC架构中,EJB属于Model中的业务层组件。
EJB的任务不外乎这三种:(1)完成某个业务逻辑;(2)访问数据库;(3)集成其它系统。
EJB运行在EJB容器中。
EJB开发者只需关注业务逻辑而不用考虑事务支持,安全性和远程对象访问等复杂的问题。
EJB3.0 规范符合JSR-220。
EJB3.0变化的只是开发和部署模型,其核心框架和架构原理并没有改变。

1. EJB3.0的类型
EJB3.0有三种类型:会话Bean,实体Bean和消息驱动Bean。
(1)会话Bean:用于完成某个任务。
例如检查客户账户历史记录。相当于“动词”。
会话Bean分为有状态会话Bean和无状态会话Bean。
有状态会话Bean在Bean中维护了状态信息,同一Bean实例可以服务同一客户的多个请求;
无状态会话Bean不持有客户状态,因此同一Bean实例不能服务同一客户的多个请求。
(2)实体Bean:代表存在于数据库中业务对象。相当于“名词”。 EJB3.0未对实体Bean做任何改动,即EJB3.0规范用“EJB2.1实体Bean”表示实体Bean。
(3)消息驱动Bean:用于“异步”地完成某个任务。
与会话Bean不同的是,MDB不存在直接客户,而是靠接收异步JMS消息来完成调用的。

【EJB容器】:指实现了EJB规范的软件产品。它提供了EJB组件的生存环境。
EJB容器为提供了如下服务:

  • 事务管理

  • 安全性

  • 资源和生命周期管理

  • 远程可访问能力

  • 支持并发请求

  • 集群和负载均衡

  • 持久化

目前,市场上有超过30个通过Sun认证的Java EE应用服务器。

问题1:JavaBean同EJB的区别?
JavaBean只是提供了get/set方法的Java类。它具有属性、事件及方法。
JavaBean只是开发组件,而不是可部署组件。
JavaBean不需要部署,因此不需要为JavaBean提供运行环境,更不需要容器了。
JavaBean只是Java类,不需要容器去实例化、销毁它们,更不需要提供任何中间件服务。

参考文献
1. 《精通EJB3.0》 罗时飞 译。

JavaEE_001: JavaEE5.0是个啥东东?(摘录+整理)

【Java EE】:Java Platform,Enterprise Edition Java 平台企业版。
Java EE囊括了Java现有的各种技术,用以支持完整的、企业级的服务端开发和部署。
目前的Java EE的版本为5.0。

我们知道,Java 平台有三个版本,这使软件开发人员、服务提供商和设备生产商可以针对特定的市场进行开发:
1. Java SE(Java Platform,Standard Edition)。
它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。
Java SE 包含了支持 Java Web 服务开发的类,并为 Java Platform,Enterprise Edition(Java EE)提供基础。
2. Java EE(Java Platform,Enterprise Edition)。
企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。
Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构SOA 和 Web 2.0 应用程序。
3. Java ME(Java Platform,Micro Edition)。
Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。
Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。
基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。

问题1:J2ee 和JavaEE的区别?
2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名以取消其中的数字“2”:J2EE更名为Java EE, J2SE更名为Java SE,J2ME更名为Java ME。

问题2:Java EE5.0技术都包括哪些技术?

  • EJB

  • JAX-WS

  • WebServcie Annotation

  • RMI和RMI-IIOP

  • JNDI

  • JDBC

  • JTA和JTS

  • JMS

  • JSP

  • JSF

  • JCA

  • JAXP

  • JAXB

  • JAAS


问题3:这些技术的标准的意义?
标准对于企业级分布式应用有很大意义,它使得:
一个复杂的问题被分解为不同的层次,在不同的层次上用标准的模块(接口)解决不同的小问题。
从而把开发人员从繁复的底层细节中解放出来,只需要编写应用级的代码。
如网络7层协议,网络通信本身依然很复杂,但开发者面对的接口相对就简单多了。

问题4:能否给一个这些技术的架构图?