JNDI API 并不同某种专用的命名技术或目录技术连在一起,也不同任何供应商的目录服务连在一起,因此它对 EJB 组件的可移植性有所贡献。例如,客户可以从多种不同的技术中选择,来为其 EJB 应用程序提供目录服务,这些技术包括:
- LDAP:Sun 的 LDAP 服务供应商支持 LDAP 协议的第 2 版和第 3 版。
- NIS:Sun 提供一个 NIS 服务供应商(NIS 即网络信息服务,以前称为黄页)。
- COS 命名:Sun 的 COS 命名服务供应商提供对 CORBA 命名服务的访问。
- 文件系统:Sun 提供一个服务供应商来访问文件系统。
- RMI 注册:Sun 为 RMI 注册提供一个服务供应商。
- Novell:有几个服务供应商可提供对目录服务 NDS 的访问以及 NetWare 3X 连接库、Novell 文件 系统和其他 Novell 服务(如扩展 NCP)的访问。
虽然 JNDI 规范对供应商是中立的,但不应认为,实现 JNDI 接口的应用程序服务器一定要能访问来自多个供应商的服务供应商代码。
JNDI 命名体系结构的关键概念包括:
- 对象和名称之间的绑定。
- 若干称为命名上下文的绑定集。
- 命名系统,即若干组命名上下文。
- 命名空间,指一个命名系统中的所有名称。
- 名称分类为原子名称、复合名称和合成名称。原子名称是不可分割的,可以绑定到一个对象上。复合名称是原子名称的组合,而合成名称则跨越多个命名系统。
命名上下文特别重要:所有的命名操作均是在上下文对象上进行的,并且名称解析过程总是从最初的命名上下文开始。
EJB 应用程序是如何使用 JNDI 的呢?JNDI 的主要用途是检索对 EJB 组件的引用。因 为 EJB 框架是一个分布式对象框架,所以 EJB 应用程序不应当假定 EJB 组件的位置。JNDI 就是 获取对 bean 的起始引用的一种机制。当一个 bean 安装到一个 enterprise bean 服务器上 时,一个被称为 EJB 容器的软件组件就负责创建各个名称-对象绑定,使所需的 Java 类文件能使用 这个 bean。应用程序使用 JNDI 的查找方法来检索对象引用,如下例所示:
|
应用程序有责任知道外部名称,应用程序就是通过这个名称才得以引用一个 enterprise bean,并通过 JNDI 来获取对该 bean 的引用的。
进一步考察 JTA
除 JNDI 以外,Enterprise JavaBeans 体系结构还使用 Java Transaction API (JTA)。因为事务对维护数据完整性和可靠性很重要,所以支持事务处理是 EJB 体系结构的一个基本部分。如果企业应用程序是分布式的,事务处理就会更加重要:
“事务的概念是一个重要的编程范例,其目的在于简化既要求可靠性又要求可用性的应用程序结构,特别是那些需要同时访问共享数据的应用程序。事务的概念最早是用在商务运作的应用程序中,其中它被用于保护集中式数据库中的数据。后来,事务的概念已扩展到分布式计算的更广泛的环境中。今天,事务是构建可靠的分布式应用程序的关键,这一点已得到广泛承认。”(见对象管理组的“Transaction Service Specification”)
有时将事务描述为具有下列特征的工作单元:
- 原子性 — 如果因故障而中断,所有结果均撤销
- 一致性 — 事务的结果保留不变的特性
- 孤立性 — 中间状态对其他事务是不可见的
- 持久性 — 已完成的事务的结果是持久的
事务的终止有两种方式:提交一个事务会使其所有的更改永久不变,而 回滚 (rolling back) 一个事务 则撤销其所有的更改。
对象管理组织 (OMG) 为一种面向对象的事务服务,即对象事务服务 (OTS),创建了一种 规范。OTS 是 EJB 体系结构内的事务服务的基础。下列事务规范就是为 enterprise bean 所采用的事务 模型而设:






