Sun ONE logo     上一个      目录      索引      下一个     
Sun ONE Application Server 7, Update 1 管理员指南



配置命名和资源

本 module 介绍了 Sun ONE Application Server 使用的 J2EE 资源,并讨论了用于创建和管理这些资源的方法:

本 module 包括以下主题:

关于 J2EE 命名服务和资源

J2EE 应用程序(包括 EJB、Web 应用程序组件和应用程序客户机)可以访问许多种类的资源,例如,资源管理器、数据源(如 SQL 数据源)、连接工厂、邮件会话、Java Message Service 目标对象以及 URL 连接工厂。J2EE 平台通过 Java 命名和目录接口 (JNDI) 命名服务将这些资源提供给应用程序。

Sun ONE Application Server 使您可以创建和管理以下 J2EE 资源:

JDBC 数据源

JDBC 数据源是一种 J2EE 资源,可使用 Sun ONE Application Server 进行创建和管理。

JDBC API 是用于和关系数据库系统进行连接的 API。JDBC API 有两个部分:

  • 一个应用程序级接口,应用程序组件使用它来访问数据库。
  • 一个服务提供者接口,用于将 JDBC 驱动程序连接到 J2EE 平台。

JDBC DataSource 对象代表以 Java 编程语言编写的数据源。从本质上来讲,数据源是一种存储数据的工具。数据源可能会像大型公司的综合数据库一样复杂,也可能会像包含行和列的文件一样简单。JDBC 数据源是一种 J2EE 资源,可通过 Sun ONE Application Server 进行创建和管理。

有关 JDBC 数据源的详细信息,请参见“关于 JDBC 资源”。

Java 邮件会话

JMS 目标是 J2EE 资源,可通过 Sun ONE Application Server 进行创建和管理。

许多 Internet 应用程序都需要具有发送电子邮件通知的能力,因此,J2EE 平台提供了 JavaMail API 以及一个使应用程序组件可以发送 Internet 邮件的 JavaMail 服务提供者。JavaMail API 有两个部分:

  • 一个应用程序级接口,应用程序组件使用它来发送邮件。
  • 一个服务提供者接口,以 J2EE SPI 级别使用。

Java 邮件会话是 J2EE 资源,可通过 Sun ONE Application Server 进行创建和管理。有关 Java 邮件会话的详细信息,请参见“关于 Java 邮件资源”。

JMS 目标

Java 消息传送服务 (JMS) 是一种用于消息传送的标准 API,支持可靠的点对点消息传送以及“发布-订阅”模式。此服务要求 JMS 提供者既可以实现点对点消息传送,同时也可以实现“发布-订阅”消息传送。

JMS 提供了两种通用的管理对象类型:连接工厂和目标。尽管这两种类型都包含提供者特定的信息,但它们在 JMS 客户机中的用途极为不同。连接工厂用于创建与消息服务器的连接,而目标对象则用于标识 JMS 消息传送服务的物理目标。

关于 Java 命名和目录接口 (JNDI)

本节将讨论 Java 命名和目录接口 (JNDI)。Java 命名和目录接口 (JNDI) 是一种应用程序编程接口 (API),用于访问不同类型的命名和目录服务。J2EE 组件通过调用 JNDI 查找方法来定位对象。

本节包括以下主题:

JNDI 体系结构

JNDI 体系结构包含一个应用程序编程接口 (API) 以及一个服务提供者接口 (SPI)。Java 应用程序使用 JNDI API 访问各种命名和目录服务。SPI 可以使各种命名和目录服务透明地插入,这样 Java 应用程序则可以使用 JNDI API 访问它们的服务。下图“JNDI 体系结构概况”说明了可通过 JNDI API 访问的服务:

   JNDI 体系结构概况
此图显示了 JNDI 体系结构的概况。

J2EE 命名服务

JNDI 名称是便于用户使用的对象名称。这些名称通过 J2EE 服务器提供的命名和目录服务绑定到其对象。由于 J2EE 组件通过 JNDI API 访问此服务,因而我们通常将一个对象的便于使用的名称称作该对象的 JNDI 名称。Pointbase 数据库的 JNDI 名称为 jdbc/Pointbase。Pointbase 启动时,Sun ONE Application Server 将从配置文件中读取信息,并自动将 JNDI 数据库名称添加到名称空间。

J2EE 应用程序客户机、企业 Bean 以及 Web 组件都需要具有权限,才能访问 JNDI 命名环境。

应用程序组件的命名环境是一种机制,使用它可以在部署或汇编期间自定义应用程序组件的商业逻辑。使用应用程序组件的环境即可对应用程序组件进行自定义,而无需访问或更改应用程序组件的源代码。

J2EE 容器实现 J2EE 应用程序组件的环境,并将该环境作为 JNDI 命名上下文提供给 J2EE 应用程序组件实例。J2EE 应用程序组件的环境的使用方式如下:

  • 应用程序组件的商业方法使用 JNDI 接口访问该环境。应用程序组件提供者在部署描述符中声明应用程序组件需要其环境在运行时提供的所有的环境项。
  • 容器实现存储应用程序组件环境的 JNDI 命名上下文。容器还提供了部署者可以用于创建和管理每个应用程序组件的环境的工具。
  • 部署者使用容器提供的工具,可以初始化应用程序组件的部署描述符中声明的环境项。部署者可以设置和修改环境项的值。
  • 容器使环境命名上下文在运行时可用于应用程序组件实例。应用程序组件的实例使用 JNDI 接口获取环境项的值。

每个应用程序组件定义了其本身的环境项集合。一个应用程序组件在同一容器内的所有实例共享相同的环境项。不允许应用程序组件实例在运行时修改环境。有关 J2EE 容器(如 Web 容器和 EJB 容器)如何使用 JNDI 命名服务查找对象的详细信息,请参见“配置 J2EE 容器”。

命名参考和绑定信息

资源参考是部署描述符中的一种元素,用于标识该资源的组件的编码名称。更具体地说,编码名称参考资源的连接工厂。在下节给出的示例中,资源参考名称是 jdbc/SavingsAccountDB。

资源的 JNDI 名称与资源参考的名称是不同的。使用此命名方法,您需要在进行部署之前先映射这两个名称,但此方法也用于将组件与资源分离开。由于此命令方法可用于分离,因而如果组件以后需要访问其它资源,则不必在代码中更改名称。这一灵活性使您可以更加容易地从先前存在的组件汇编 J2EE 应用程序。

下表“JNDI 查找及其关联参考”列出了 Sun ONE Application Server 使用的 J2EE 资源的 JNDI 查找及其关联参考。

   JNDI 查找及其关联参考

JNDI 查找名称

关联参考

java:comp/env

 

应用程序环境项

 

java:comp/env/jdbc

 

JDBC 数据源资源管理器连接工厂

 

java:comp/env/ejb

 

EJB 参考

 

java:comp/UserTransaction

 

UserTransaction 参考

 

java:comp/env/mail

 

JavaMail 会话连接工厂

 

java:comp/env/url

 

URL 连接工厂

 

java:comp/env/jms

 

JMS 连接工厂和目标

 

java:comp/ORB

 

应用程序组件之间共享的 ORB 实例

 

J2EE 标准部署描述符中的命名参考

命名参考是一种字符串,应用程序使用这种字符串在指定的命名上下文中查找对象。每个 J2EE 应用程序都有一个命名上下文,而且其参考在标准组件部署描述符中进行了配置。本节介绍了 Sun ONE Application Server 中使用的标准部署描述符功能。本节包括以下主题:

应用程序环境项

环境项是使用 <env-entry> 定义的,它提供了一种为 J2EE 应用程序指定部署时间参数的方法。注意,如果是 Web 应用程序,则可以使用 <context-param> 定义 servlet 上下文初始化参数,但 <env-entry> 是首选方法,因为应用程序部署者通过明确指定此类应用程序参数的名称、类型和值来对其进行配置。

下面的样例介绍了 J2EE 标准部署描述符中指定的 <env-entry> 的语法:

<env-entry>
<description> Send pincode by mail </description>
<env-entry-name> mailPincode </env-entry-name>
<env-entry-value> false </env-entry-value>
<env-entry-type> java.lang.Boolean </env-entry-type>
</env-entry>

<env-entry-type> 标记为项指定了一个全限定的类名。下面是一个代码段,它使用 JNDI 从应用程序组件(该术语指 servlet/JSP 或实体 Bean 或 IIOP 应用程序客户机)中查找 <env-entry>:

Context initContext = new InitialContext();
Boolean mailPincode = (Boolean)
initContext.lookup("java:comp/env/mailPincode");

// 用户可以在子上下文中使用相对名
Context envContext = initContext.lookup("java:comp/env");
Boolean mailPincode = (Boolean)
envContext.lookup("mailPincode");

EJB 参考

除了部署描述符支持之外,JNDI 命名服务使应用程序能够使用“逻辑”名称(称为 EJB 参考)映射到企业 Bean 的主接口,如下面的示例所述:

<ejb-ref>
<ejb-ref-name> ejb/EmplRecord </ejb-ref-name>
<ejb-ref-type> Entity </ejb-ref-type>
<home> com.wombat.empl.EmployeeRecordHome </home>
<remote> com.wombat.empl.EmployeeRecord </remote>
<ejb-link> EmployeeEJB </ejb-link>
</ejb-ref>

像 JSP 这样的应用程序组件可以使用 JNDI 访问 EJB 主对象,如下面的示例所述:

Context initContext = new InitialContext();
Context envContext = initContext.lookup("java:comp/env");
Object result = envContext.lookup("ejb/EmplRecord");
EmployeeRecordHome emplRecordHome = (EmployeeRecordHome)
javax.rmi.PortableRemoteObject.narrow(result, EmployeeRecordHome.class);

ejb-ref-name 元素定义了应用程序代码中使用的字符串(如上面给出的示例所示)。ejb-link 元素将此参考链接到使用 ejb-name 元素定义的目标企业 Bean,而 ejb-name 元素属于 ejb-jar.xml 中定义的实体 Bean。还可以提供链接功能,而无需修改应用程序部署描述符或企业 Bean 描述符。

资源管理器连接工厂的参考

工厂是一种根据需要创建其它对象的对象。资源工厂创建资源对象,例如,数据库连接或消息服务连接。它们是使用标准部署描述符中的 <resource-ref> 元素进行配置的。

以下示例介绍了工厂的使用:

示例 A:

以下示例声明了对返回对象类型为 javax.sql.DataSource 的 JDBC 连接工厂的参考:

<resource-ref>
<description> Primary database </description>
<res-ref-name> jdbc/primaryDB </res-ref-name>
<res-type> javax.sql.DataSource </res-type>
<res-auth> Container </res-auth>
</resource-ref>

示例 B:

下面是对 JavaMail 会话资源工厂的参考的示例:

<resource-ref>
<description> mail Session </description>
<res-ref-name> mail/Session </res-ref-name>
<res-type> javax.mail.Session </res-type>
<res-auth> Container </res-auth>
</resource-ref>

<res-type> 是该资源工厂的全限定类名。可以将 Container 或 Application 作为值指定给 <res-auth> 变量。有关配置 JavaMail 会话资源工厂的详细信息,请参见“关于 Java 邮件资源”。

如果指定了 Container,Web 容器会在将资源工厂绑定到 JNDI 查找注册表之前进行验证。如果指定了 Application,servlet 必须以编程方式进行验证。不同类型的资源工厂将在描述了资源类型的单独的子上下文中进行查找,如下所示:

  • jdbc/,用于 JDBC javax.sql.DataSource 工厂
  • jms/,用于 JMS javax.jms.QueueConnectionFactory 或 javax.jms.TopicConnectionFactory
  • mail/,用于 JavaMail javax.mail.Session 工厂
  • url/,用于 java.net.URL 工厂

下面是一个代码段,它通过用容器处理验证,从应用程序组件获取 JDBC 连接:

InitialContext initContext = new InitialContext();
DataSource source =
(DataSource) initContext.lookup("java:comp/env/jdbc/primaryDB");
Connection conn = source.getConnection();

注意,为了确保这些资源参考正常工作,res-ref-name 必须在运行时映射到有效的资源工厂。

资源环境参考

资源环境参考提供了一种可以通过 JNDI 查找访问与资源关联的管理对象的方法。例如,某个应用程序可能需要访问 JMS 目标对象。标准部署描述符中定义的 <resource-env-ref> 元素使应用程序可以声明资源要求。

<resource-env-ref> 与 <resource-ref> 元素之间的主要区别是 <resource-ref> 没有特定的资源验证要求,但两种元素都必须通过资源工厂描述符进行备份。

示例:

<resource-env-ref>
<description> My Topic </description>
<res-env-ref-name> jms/MyTopic </res-ref-name>
<res-env-ref-type> javax.jms.Topic </res-type>
</resource-env-ref>

使用下面代码段,您可以访问 JMS 主题对象:

InitialContext initContext = new InitialContext();
javax.jms.Topic myTopic =
(javax.jms.Topic) initContext.lookup("java:comp/env/jms/MyTopic");

注意,为了使这些 resource-env-ref 变量正常工作,管理员必须在运行时使目标资源工厂可用。有关访问 JMS 主题目标和队列目标的详细信息,请参见“使用 JMS 服务”。

UserTransaction 参考

J2EE 要求容器在 JNDI 名称 java:comp/UserTransaction 处提供 UserTransaction 对象实现。UserTransaction 对象使应用程序可以启动、提交和中止事务。

要以编程方式启动和执行事务,组件通过针对 java:comp/UserTransaction 执行 JNDI 参考,获取容器的默认事务协调器的参考。返回的对象实现 javax.transaction.UserTransaction 接口,并可用于在程序中启动、提交、回滚和查询事务的状态。Sun ONE Application Server 中的 JNDI 实现支持诸如对事务协调器的查找。有关 javax.transaction.UserTransaction 接口的详细信息,请参见“使用事务服务”。

初始命名上下文

Sun ONE Application Server 中的命名支持主要基于 J2EE 1.3,同时添加了一些增强功能。当应用程序组件通过 InitialContext() 创建初始上下文时,Sun ONE Application Server 返回一个充当应用程序命名环境的句柄的对象。此对象又为 java:comp/env namespace 提供了子上下文。每个应用程序获取其自己的名称空间,这就是说,java:comp/env namespace 是针对每个应用程序的,而且一个应用程序的名称空间中绑定的对象不与其它应用程序中绑定的对象发生冲突。

COSNaming 服务

EJB 互操作性协议要求使用 COSNaming 协议,以便使用 JNDI API 查找 EJB 对象。

要在 CosNaming 服务中发布 EJBHome 对象参考,则需要使用 EJB 容器。CosNaming 必须在定义的 CosNaming 模块中实现 IDL 接口,并使客户机可以通过 IIOP 调用解析和列表操作。

CosNaming 服务在提供根 NamingContext 对象的主机、端口和对象关键字时,必须遵守 CORBA Interoperable Name Service 规范中的要求。CosNaming 必须能够服务于使用提供的主机、端口和对象关键字的根 NamingContext 的 IIOP 调用。

需要使用客户机容器(即 EJB、Web 或应用程序客户机容器)以包含 JNDI CosNaming 服务提供者,该服务提供者使用 Interoperable Name Service 规范中定义的机制与服务器的 CosNaming 服务进行联系,并通过标准 CosNaming API 解析 EJBHome 对象。JNDI CosNaming 服务提供者可能使用 JNDI SPI 体系结构,也可能不使用该体系结构。JNDI CosNaming 服务提供者必须从以下 URL 创建对象参考,才能访问服务器的 CosNaming 服务的根 NamingContext:

corbaloc:iiop:1.2@<host>:<port>/<objectkey>(其中,<host>、<port> 和 <objectkey> 是由服务器的 CosNaming 服务提供的或通过一种等效机制提供的根 NamingContext 的值)。

部署时,客户机容器的开发者应该为客户机组件的部署描述符中每个 ejb-ref 元素获取服务器的 CosNaming 服务的主机、端口和对象关键字,以及服务器 EJBHome 对象的 CosNaming 名称(例如,通过浏览服务器的名称空间)。这样,ejb-ref-name(由 JNDI 查找调用中的客户机代码使用)将会链接到 EJBHome 对象的 CosNaming 名称。运行时,客户机组件的 JNDI 查找调用使用 CosNaming 服务提供者,该服务提供者联系服务器的 CosNaming 服务、解析 CosNaming 名称并将 EJBHome 对象参考返回到客户机组件。

由于 EJBHome 对象的名称在 CosNaming 服务(通过提供的主机和端口可以访问)的命名空间范围之内,因此没有必要结合客户机容器和服务器容器的名称空间。

使用 CosNaming 的好处是,不仅可以获得与非 J2EE CORBA 客户机和服务器更好的内部互操作性,还可以更好地与内部互操作性所需的 IIOP 基础架构进行集成。由于 CosNaming 仅存储 CORBA 对象,因此,供应商很可能会使用其它企业目录服务,以便存储其它资源。

Sun ONE Application Server 按照 J2EE 1.3 规范集成了 JNDI 的所有命名资源。

CosNaming 提供者.

为了支持全局 JNDI 名称空间(使其接受 IIOP 应用程序客户机的访问),Sun ONE Application Server 包括了支持对 CORBA 参考(远程 EJB 参考)进行绑定的、基于 J2EE 的 CosNaming 提供者。返回到 IIOP 客户机的 InitialContext 是 CosNaming 提供者。一个 Sun ONE Application Server 服务器的实例注册了 IIOP 客户机要查找并绑定到的实体 Bean。

注意,Sun ONE Application Server 处理存储在 CosNaming 中的对象,而本地 JNDI 命名环境是暂时的:也就是说,在每次服务器启动以及应用程序重新加载时,都会再次把所有相关对象重新绑定到名称空间。有关配置对 CORBA/IIOP 客户机的支持的详细信息,请参见“为 Corba/IIOP 客户机配置服务器”。

JNDI 连接工厂

对于 J2EE Web 应用程序,web.xml 文件中的部署描述符是定义应用程序环境项、资源管理器(如 SQL 数据源)连接工厂或 EJB 的参考的占位符。应用程序使用 J2EE 容器提供的 JNDI InitialNamingContext 查找这些参考。这样,仅通过对部署描述符进行更改(即不需要访问或修改应用程序的源代码),应用程序即可移植到不同的应用程序服务器环境中。同样地,J2EE 要求将实体 Bean 的部署描述符 (ejb-jar.xml) 以及 IIOP 应用程序客户机 (application-client.xml) 作为这些 JNDI 命名参考的主要工具。

连接工厂是一种对象,它生成使 J2EE 组件能够访问资源的连接对象。数据库的连接工厂是一种 javax.sql.DataSource 对象,该对象创建 java.sql.Connection 对象。

在 Sun ONE Application Server 中,您可以配置访问以下资源和资源工厂的方式:

  • JDBC 连接工厂
  • 基于 MQ 的 JMS 连接工厂
  • JavaMail 会话连接工厂
  • JCA 连接器工厂
  • 用户编写的普通自定义资源对象工厂。
  • 支持诸如 LDAP 这样的外部资源系统信息库

所有 Sun ONE Application Server 资源工厂是在 server.xml 中的 <resources> </resources> 标记内指定的,并且具有一个用 jndi-name 属性指定的 JNDI 名称。此属性用于在服务器范围内的名称空间中注册工厂。部署者可以使用 resource-ref-mapping 元素,将用户指定的、应用程序特定的资源参考名称(在 resource-ref 或 resource-env-ref 元素内声明)映射到这些服务器范围内的资源工厂。这样有助于在部署时进行决定给定的应用程序使用哪些 JDBC 驱动程序(和其它资源工厂)。

自定义资源访问本地 JNDI 系统信息库,外部资源访问外部 JNDI 系统信息库。这两种类型的资源都需要用户指定的工厂类元素、JNDI 名称属性等。在本节中,我们将讨论如何为 J2EE 资源配置 JNDI 连接工厂资源,以及如何访问这些资源。

本节包括以下主题:

创建自定义资源

server.xml 中定义的 custom-resource 元素提供了一种指定自定义的服务器范围的资源对象工厂的方法。这种对象工厂实现 javax.naming.spi.ObjectFactory 接口。此元素将一个要在服务器范围的命名空间中使用的 JNDI 名称(通过 jndi-name 子元素进行指定,就像其它 Sun ONE Application Server 资源一样)、类型、其资源工厂类的名称以及一组用于实例化相同属性的标准属性关联起来。

以下示例说明了如何实现 javax.naming.spi.ObjectFactory 接口:

<resources> <custom-resource jndi-name="test/myBean"
res-type="test.MyBean"factory-class="test.MyBeanFactory"
enabled="true">

<property name="foo" value="test custom bean prop" />
</custom-resource>
</resources>

您需要确保该资源参考的环境参考和 EJB 参考已链接到配置的服务器范围的资源;而这些资源是使用 server.xml 中的 custom-resource 和 external-jndi-resource 标记定义的。动态地重新部署应用程序组件是 JNDI 命名环境中的一个问题。Sun ONE Application Server 将发布所有应用程序特定的参考,并将所有的新参考重新绑定到新安装的应用程序的命名上下文中。

使用管理界面创建自定义资源的步骤:

  1. 在管理界面的左侧窗格中,打开要修改其 JNDI 配置的 Sun ONE Application Server 实例。
  2. 打开“JNDI”标签,并单击“Custom Resources”。任何已经创建的自定义资源将会列表显示在右侧窗格中。要创建新的自定义资源,单击“New”。您会在管理界面的右侧窗格中看到下图“JNDI Custom Resources”页:

   “JNDI Custom Resources”页
此图显示了“JNDI Custom Resources”页的可配置的设置。

  1. 在“JNDI Name”字段中,输入要访问资源的名称。此名称将注册到 JNDI 命名服务中。
  2. 在“Resource Type”字段中,输入全限定的类型定义,如上面示例中所示。应遵照以下格式在“Resource Type”中输入定义:xxx.xxx。
  3. 在“Factory Class”字段中,为要创建的自定义资源输入工厂类名。该字段中的值是用户指定的工厂类的名称。此类实现了 javax.naming.spi.ObjectFactory 接口。
  4. 在“Description”字段中,为所创建的资源输入说明。此说明是字符串值,最多可以包含 250 个字符。
  5. 选中“Custom Resource Enabled”复选框,将启用自定义资源。
  6. 单击“OK”保存自定义资源。

创建外部 JNDI 资源

使用管理界面创建外部资源的步骤:

  1. 在管理界面的左侧窗格中,打开要修改其 JNDI 配置的 Sun ONE Application Server 实例。
  2. 打开“JNDI”并选择“External Resources”。任何已经创建的外部资源将会以列表形式显示在右侧窗格中。要创建新的外部资源,单击“New”。
  3. 您会在管理界面的右侧窗格中看到以下窗口,如“JNDI External Resources”页中所示:

   “JNDI External Resources”页
此图显示可配置的“JNDI External Resources”选项。

  1. 在“JNDI Name”字段中,输入要访问资源的名称。此名称将注册到 JNDI 命名服务中。
  2. 在“Resource Type”字段中,输入全限定的类型定义,如上面示例中所示。应遵照以下格式在“Resource Type”中输入定义:xxx.xxx。
  3. 在“JNDI Lookup”字段中,输入要在外部系统信息库中查找的 JNDI 值。例如,当您创建一个与外部系统信息库连接的外部资源时,为了测试某个 Bean 类,“JNDI Lookup”可能会读取 cn=testmybean。
  4. 在“Factory Class”字段中,输入 JNDI 工厂类外部系统信息库(例如,com.sun.jndi.ldap)。此类实现了 javax.naming.spi. ObjectFactory 接口。
  5. 在“Description”字段中,为所创建的资源输入说明。此说明是字符串值,最多可以包含 250 个字符。
  6. 选中“External Resource Enabled”复选框,将启用外部资源。
  7. 单击“OK”保存自定义资源。

访问外部 JNDI 系统信息库

通常,Sun ONE Application Server 上运行的应用程序需要访问外部 JNDI 系统信息库中存储的资源。例如,一般的 Java 对象可能会以 Java 模式存储在 LDAP 服务器中。外部 JNDI 资源元素允许用户配置此类外部资源系统信息库。外部 JNDI 工厂必须实现 javax.naming.spi.InitialContextFactory 接口。

示例:

<资源>
<!-- external-jndi-resource 元素指定如何访问存储在外部
-- JNDI 系统信息库中的 J2EE 资源。下面的示例
-- 说明如何访问 LDAP 中存储的 Java 对象。
-- factory-class 元素指定了访问资源工厂时所需的
-- JNDI InitialContext 工厂。属性元素
-- 与适用于外部 JNDI 上下文的环境相匹配,
-- jndi-lookup-name 引用 JNDI 名称,查找并获取
-- 指定的(在此示例中为 java)对象。
-->
<external-jndi-resource jndi-name="test/myBean"
jndi-lookup-name="cn=myBean"
res-type="test.myBean"
factory-class="com.sun.jndi.ldap.LdapCtxFactory">

<property name="PROVIDER-URL" value="ldap://ldapserver:389/o=myObjects" />
<property name="SECURITY_AUTHENTICATION" value="simple" />
<property name="SECURITY_PRINCIPAL", value="cn=joeSmith, o=Engineering" />
<property name="SECURITY_CREDENTIALS" value="changeit" />
</external-jndi-resource>
</resources>

映射应用程序资源参考

应用程序特定的资源参考必须被映射到预定义的服务器范围的资源工厂。Sun ONE Application Server 特有的资源参考映射元素就用于此种用途。

下面的示例中说明了一个 Web 应用程序的部署描述符 web.xml,它将资源参考指定为 JDBC DataSource。

<resource-ref>
<res-ref-name> jdbc/EstoreDataSource </res-ref-name>
<res-type> javax.sql.DataSource </res-type>
<res-auth> Container </res-auth>
</resource-ref>

所需的 res-ref-name 也可以映射到容器范围的 Orcale JDBC 连接资源工厂,如下面所示:

<resource-ref>
<res-ref-name> jdbc/EstoreDataSource </resource-ref-name>
<jndi-name> jdbc/estore/InventoryDB </jndi-name>
</resource-ref>

关于 URL 连接工厂资源

URL 连接工厂不需要在 server.xml 中定义任何资源。相应的 Sun ONE Application Server 应用程序(Web 或 ejb)部署描述符的 jndi-name 元素指定了目标 URL。

例如,我们假定某个 Web 应用程序的部署描述符 web.xml 指定了一个 java.net.URL 资源参考,而且将该资源参考映射到 sun-web.xml 中的 URL http://www.sun.com/index.html:

映射情况如下所示:

<resource-ref>
<res-ref-name>myURL</res-ref-name>
<res-type>java.net.URL</res-type>
<res-auth>Container</res-auth>
</resource-ref>

<sun-web-app>
<resource-ref>
<res-ref-name>myURL</res-ref-name>
<jndi-name> http://www.sun.com/index.html </jndi-name>
</resource-ref>
</sun-web-app>

映射应用程序资源环境参考

应用程序特定的资源环境参考声明必须被映射到该应用程序服务器的运行时环境中可用的目标资源对象。Sun ONE Application Server 特定的配置文件中定义的资源环境映射元素使部署者可按如下方式进行映射:

示例:

<resource-env-ref>
<description> My Topic </description>
<res-env-ref-name> jms/MyTopic </res-ref-name>
<res-env-ref-type> javax.jms.Topic </res-type>
</resource-env-ref>

此参考被映射到 server.xml 中定义的 jms/iMQ/Topics/Stocks/SUNW 主题。有关详细信息,请参见《Sun ONE Application ServerAdministrator's Configuration File Reference》。

<resource-env-ref-mapping>
<res-env-ref-name> jms/MyTopic </res-ref-name>
<jndi-name> jms/iMQ/Topics/Stocks/SUNW </jndi-name>
</resource-env-ref-mapping>

映射 EJB 参考

也可以将真正用于应用程序代码中的 ejb-name 和用于目标企业 Bean 的 ejb-name 分离开。当您不想修改 Web 应用程序部署描述符 web.xml 以及使用企业 Bean 部署描述符的 ejb-name 时,这尤其有用。Sun ONE Application Server 特定的配置使您可以将 ejb-ref-name 元素映射到目标 Bean 的 ejb-name,而无需使用 Sun ONE Application Server 特定的部署描述符中的 ejb-ref-mapping 元素。

示例:

<ejb-ref>
<ejb-ref-name> ejb/EmplRecord </ejb-ref-name>
<ejb-ref-type> Entity </ejb-ref-type>
<home> com.wombat.empl.EmployeeRecordHome </home>
<remote> com.wombat.empl.EmployeeRecord </remote>
</ejb-ref>

<ejb-ref>
<ejb-ref-name> ejb/EmplRecord </ejb-ref-name>
<jndi-name> AccountEJB </jndi-name>
</ejb-ref-mapping>

关于 Persistence Manager 资源

此模块介绍了持久性,并且其中建立的框架可用于 Sun ONE Application Server 支持的可插接的 Persistence Manager。

此模块包括以下主题:

什么是持久性?

多数商业应用程序的一个关键方面是对持久性数据进行程序操作;持久性数据即存储在应用程序之外的长期存在的数据。尽管将持久性数据读入临时内存中仅为了使用或修改目的,但该数据会写出到关系数据库或平面文件系统进行长期存储。

在面向对象的编程系统中,持久性数据在内存中表示为应用程序代码操作的一个或多个数据对象。一般说来,数据存储库中的持久性数据与其在内存中表示为的持久性数据对象之间的通信是通过许多软件层实现的,如下图“基本持久性模式”所示:

   基本持久性模式
此图显示了用于内存中表示的持久性数据的基本持久性模式。

每个数据存储库都有一个通过驱动程序软件与外部世界的接口,驱动程序软件用于建立和维护数据存储库和应用程序之间的连接。建立连接后,将使用查询语言从数据存储库检索信息并将数据读入应用程序,或者将数据从应用程序写到数据存储库之中。另一软件层提供了内存中的数据对象与数据存储库中的信息之间的映射关系。

通过此普通模式,程序员可以将持久性数据表示为运行时对象,使其由应用程序使用和操作。此模式支持所有的基本持久性操作,经常缩写为 CRUD:

  • C - 创建持久性数据(插入到数据存储库中)
  • R - 检索持久性数据(从数据存储库中选择)
  • U - 更新持久性数据
  • D - 删除持久性数据

Persistence Manager 的角色

Persistence Manager (PM) 负责 EJB 容器中具有容器管理的持久性的实体 Bean 的持久性。实体 Bean 提供者负责将实体 Bean 类提供为抽象类。Persistence Manager 提供者的工具负责提供具体实现。可以通过以下方式达到以上目标:对抽象实体 Bean 及相关类进一步分类并提供具体实现,或者通过利用封装和委托。

Persistence Manager 的工具所提供的类负责管理实体 Bean 之间的关系,并负责管理对其持久性状态的访问。PM 工具还负责提供 java.util.Collection 类的实现,这些类用于维护容器管理的关系 (CMR)。

预部署 Bean 配置

企业 Java Bean 标准为实体 Bean 提供了两种持久性类型。一种是容器管理的持久性 (CMP),另一种是 Bean 管理的持久性 (BMP)。EJB 2.0 规范没有定义 EJB 服务器和持久性管理器之间的标准 API。

本节讲述了部署和代码生成时的集成要求。部署可用于指多种事情。一般认为部署过程包括三个截然不同的步骤:配置、代码生成和安装。

必须为一个 Bean 指定多个属性,包括所用的持久性机制、持久性供应商、所用版本,以及持久性机制所需的其它信息。多数的持久性供应商都具有项目的概念,项目代表可以作为一个单位部署的所有相关的 Bean 及其从属类。每个项目可以有一个供应商特定的 xml 文件。

支持部署用途的三种标准文件:ejb-jar.xml、sun-ejb-jar.xml 以及 sun-cmp-mappings.xml。sun-ejb-jar.xml 中每个带有 CMP Bean 的 EJB 模块必须具有一个 <pm-descriptors>,<pm-descriptors> 中至少带有一个 <pm-descriptor> 元素(该元素指定了另外五个属性)。这五个属性是 pm-identifier、pm-version、pm-config、pm-class-generator 以及 pm-mapping-factory。

Sun ONE Application Server 特定的描述符(正如在 sunEjb_jar_2_0.DTD 中)定义持久性管理器相关的标记。以下是一个用 Sun ONE Application Server DTD 定义的 CMP 描述符样例:

PM 描述符包含一个或多个 pm 描述符,但其中只有一个描述符必需在任何指定时间都使用

-->

<!ELEMENT pm-descriptors ( pm-descriptor+, pm-inuse)>

<!--

pm-descriptor 描述了与实体 Bean 关联的持久性

管理器的属性

-->

<!ELEMENT pm-descriptor ( pm-identifier, pm-version, pm-config?, pm-class-generator?,

pm-mapping-factory?)>

<!--

此元素描述了提供 PM 实现的供应商,例如,这可能是 Sun ONE Application Server Transparent Persistence、TopLink、Versant 或 CocoBase:

-->

<!ELEMENT pm-identifier (#PCDATA)>

<!--

pm-version 进一步指定了要使用的 PM 供应商产品的版本

-->

<!ELEMENT pm-version (#PCDATA)>

<!--

pm-config 指定了要使用的供应商特定的配置文件

-->

<!ELEMENT pm-config (#PCDATA)>

<!--

pm-class-generator 指定了供应商特定的具体类产生器

这是供应商特定的类的名称:

-->

<!ELEMENT pm-class-generator (#PCDATA)>

<!--

pm-mapping-factory 指定了供应商特定的映射工厂

这是供应商特定的类的名称:

-->

<!ELEMENT pm-mapping-factory (#PCDATA)>

创建新的 Persistence Manager

使用 管理界面,可以创建新的 Persistence Manager 实例。创建新的 Persistence Manager 实例的步骤:

  1. 从管理界面的左侧窗格中,打开要为其创建新的 Persistence Manager 的 Sun ONE Application Server 实例。从显示的服务器组件列表中单击“Persistence Manager”。
  2. 任何已经为 Sun ONE Application Server 的该特定实例创建的 Persistence Manager 将列表显示在管理界面的右侧窗格中。

  3. 要创建新的 Persistence Manager,单击“New”。您会在看到以下窗口,如图“创建新的 Persistence Manager”所示:

  
此图显示了如何创建新的持久性管理器。
创建新的 Persistence Manager

  1. 这是应用程序服务器运行时代表应用程序查找特定 Persistence Manager 时所用的 JNDI 名称。此名称必须与在 Sun 特定部署描述符的实体 Bean 的 CMP 资源元素中定义的名称相同。
  2. 在“Description”字段中,为新的 Persistence Manager 输入说明。此字段的值是字符串,最多可以包含 250 个字符。
  3. 在“Factory Class”字段中,为 Persistence Manager 输入工厂类连接。setEntityContext 通过 JNDI 名称查找功能查找此连接工厂。该工厂类名称是创建 Persistence Manager 实例的 Persistence Manager Factory 的类名。默认情况下,将此设置为 Sun ONE Application Server 的内部 Persistence Manager Factory 类;如果使用替代实现,则必须确保此类在服务器类路径中可用。
  4. 从“Connection Pool”下拉列表中,选择要将新的 Persistence Manager 加入到其中的数据库连接池。使用连接加入,实体 Bean 可以请求单个连接,并使用该连接执行多个客户机线程的并发语句。与任何其它数据库访问一样,Persistence Manager 可以使用连接加入提高性能和可缩放性。选择现有连接池,或者选择“None Selected”(如果尚未创建连接池)。
  5. 注意:系统将自动创建 JDBC 资源,以允许 PM 运行时使用 JNDI 绑定到连接池 � 如果 JDBC 资源的 JNDI 名称前加上一个“PM”前缀,则它与 PM JNDI 名称完全相同。删除 Persistence Manager 同时将删除关联的 JDBC 资源。

  6. 要启用 Persistence Manager,选中“Persistence Manager Enabled”复选框。Persistence Manager 现在已为指定的连接工厂启用。
  7. 单击“OK”保存所做的更改。

关于 JDBC 资源

此模块概述了 JDBC API,然后具体介绍了 JDBC 资源及其在 Sun ONE Application Server 中的实现和应用。

此模块包括以下主题:

关于 JDBC API

JDBC API 是一种 Java API,它可用于访问几乎所有类型的表格式数据。(有意思的是,JDBC 是商标名称而不是首字母缩写;然而,JDBC 通常被认作是“Java Database Connectivity”的缩写。)JDBC API 包含一组用 Java 编程语言编写的类和接口,为工具/数据库开发者提供了标准的 API;而且使用 JDBC API 可以利用一种全 Java API 编写数据库应用程序。

JDBC API 使得将 SQL 语句发送到关系数据库系统更加容易,并且支持 SQL 的所有语言。但是 JDBC 3.0 API 超出了 SQL 的范围,而且使与其它种类数据源(如数据库之外的文件)进行交互成为可能。

JDBC API 的优势在于应用程序可访问几乎所有的数据源,并且可以使用 Java 虚拟机在任何平台上运行。换言之,有了 JDBC API,就不必编写一个程序来访问 Sybase 数据库,编写另一个程序来访问 Oracle 数据库,再编写一个程序来访问 IBM DB2 数据库,等等。您可以使用 JDBC API 编写一个能够将 SQL 或其它语句发送到相应的数据源的程序。同时,有了用 Java 编程语言编写的应用程序,您就不必为编写在不同平台上运行的不同应用程序而感到苦恼。Java 平台与 JDBC API 组合在一起,使程序员只需进行一次编写即可从任何地方运行代码。

JDBC API 有什么功能?

使用基于 JDBC 技术的驱动程序(JDBC 驱动程序),可以完成以下三个步骤:

  • 建立与数据源的连接
  • 将查询和更新语句发送到数据源
  • 处理结果

以下代码段是这三个步骤的一个简单示例:

Context ctx = new InitialContext();

DataSource ds = (DataSource)ctx.lookup("jdbc/AcmeDB");

Connection con = ds.getConnection("myLogin", "myPassword");

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");

while (rs.next()) {

int x = rs.getInt("a");

String s = rs.getString("b");

float f = rs.getFloat("c");

}

关于数据库访问模式

JDBC API 支持双层式和三层式数据库访问模式。Sun ONE Application Server 中集成了更常用的双层式数据库访问模式。

本节包括以下主题:

双层式数据库访问模式

在双层式数据库访问模式中,Java 小程序或应用程序使用 DBMS 专用协议直接与数据源进行通信。此访问模式需要 JDBC 驱动程序,该驱动程序可以与所访问的特定数据源进行通信。用户的命令传输到数据库或其它数据源,并且这些语句的结果被返回给用户。数据源可能位于用户通过网络与其连接的另一台计算机上。此配置称为客户机/服务器配置,其中,用户的计算机被当作客户机,而数据源所在的计算机被当作服务器。网络可以是一个 Intranet(例如,可用于连接某个公司内部的员工),也可以是 Internet。

三层式数据库访问模式

在三层式数据库访问模式中,Java 小程序或应用程序将命令发送到服务的“中间层”,该中间层再将命令发送到数据源。客户机应用程序通过 HTTP、RM、CORBA 或其它调用与中间层进行通信。中间层通过 DBMS 专用协议与数据存储库进行通信。数据源处理命令,并将结果发送回中间层,中间层再将结果发送给用户。MIS 主管们对三层式模型非常感兴趣,因为使用中间层可以控制其他人对公司数据的访问以及控制可对公司数据进行的更新的类型。三层式模式的另一个优点是可以简化应用程序的部署。最后一个优点是,三层式体系结构在许多情况下可以提供性能优势。

关于 JDBC 数据源

DataSource 对象在 Java 编程语言中表示数据源。从本质上来讲,数据源是一种存储数据的工具。数据源可能会像大型公司的综合数据库一样复杂,也可能会像包含行和列的文件一样简单。数据源可以位于远程服务器上,也可以位于本地桌面计算机上。应用程序使用连接访问数据源,并且可以将 DataSource 对象视为一个用于与该 DataSource 实例代表的特定数据源连接的工厂。DataSource 接口提供了两种建立与数据源的连接的方法。

DataSource 对象中包含的属性标识并描述了该对象所代表的数据源。另外,DataSource 对象使用 JNDI 命名服务,并且该对象单独地从使用其的应用程序中创建、部署和管理。驱动程序供应商将提供一个类,该类是 DataSource 接口(该供应商的 JDBC 2.0 or 3.0 驱动程序产品的组成部分)的基本实现。

本节包括以下主题:

DataSource 对象的属性

DataSource 对象有一组属性,它们标识并描述了该对象所代表的现实世界的数据源。这些属性包括的信息有:数据库服务器的位置、数据库的名称、用来与服务器通信的网络协议,等等。DataSource 属性遵照 JavaBeans 设计模式,并且通常是在 DataSource 对象部署时进行设置的。

为促使不同供应商的 DataSource 实现保持一致,JDBC 2.0 API 指定了一组标准属性,并为每个属性指定了标准名称。

一个实现 DataSource 接口的类的实例代表一个特定数据源。该实例生成的每个连接都将参考同一个数据源。在 DataSource 的基本实现中,对方法 DataSource.getConnection 的调用返回一个连接对象,该连接对象和 DriverManager 工具返回的连接对象一样,是一个与数据源的物理连接。

JNDI 为应用程序提供了一种在网络上查找和访问远程服务的统一方法。远程服务可以是任何企业服务(包括消息传送服务或应用程序特定的服务),当然,JDBC 应用程序的主要着眼点是数据库服务。通过 JNDI 命名服务创建并注册了 DataSource 对象之后,应用程序则可以使用 JNDI API 访问该 DataSource 对象,然后可以使用该对象连接其所代表的数据源。

实现连接加入的 DataSource 对象同样会生成一个与 DataSource 类所代表的特定数据源的连接。但是,方法 DataSource.getConnection 返回的连接对象是 PooledConnection 对象的句柄,而不是物理连接。应用程序以其通常方式使用连接对象,如果发生不同的情况,一般也不会意识到。连接加入不会对应用程序代码产生任何影响,只是合并的连接就像所有连接一样,应始终明确关闭。当应用程序关闭一个加入的连接时,该连接会加入到一个可重复使用的连接池中。下次调用 DataSource.getConnection 时,就会返回池中的一个连接的句柄(如果存在连接)。由于连接加入避免了每次请求连接时都创建一个新的物理连接,因而有助于显著提高应用程序的运行速度。

同样可以实现一个 DataSource 类,以便使用分布式事务环境。例如,EJB 服务器支持分布式事务,并需要一个 DataSource 类,该类实现后可以与其进行交互。在此情况下,DataSource.getConnection 方法返回一个可在分布式事务中使用的 Connection 对象。一般而言,EJB 服务器支持连接加入以及分布式事务。和连接加入一样,事务管理是在内部处理的,因此分布式事务非常便于容易。唯一的要求是,当事务为分布式时(这需要两个或更多数据源),应用程序不能调用事务方法,无论 commit 还是 rollback。该应用程序也不能将连接置于自动提交模式。存在这些限制的原因是,事务管理器以隐蔽的方式开始和结束分布式事务,因此应用程序不能执行任何可能会在事务开始或结束时造成影响的操作。有关 Java 事务的详细信息,请参见“使用事务服务”。

注册 JDBC 资源

您可以使用管理界面或命令行界面将 JDBC 资源注册到 Sun ONE Application Server。

本节包括以下主题:

使用命令行注册资源

要使用命令行界面接口注册 JDBC 资源,运行以下命令:

./asadmin create-jdbc-resource

用于注册 JDBC 资源的 XML 片段应指定以下的几个属性(摘自 sun-server_7_0.dtd)。

<!-- JDBC javax.sql.DataSource resource definition -->

<!ELEMENT jdbc-resource (description?, property*)>

<!ATTLIST jdbc-resource jndi-name CDATA #REQUIRED

pool-name CDATA #REQUIRED

enabled %boolean; 'true'>

注意,此片段所指定的不过是应用程序用来引用其所代表的数据源(从 J2EE 内部)的符号名。pool-name 属性指向命名池定义,该定义将指定数据库连接的各个方面。管理员可以使用已启用属性关闭一些资源。

使用管理界面注册资源

使用管理界面注册资源的步骤:

  1. 在管理界面的左侧窗格中,打开要为其注册 JDBC 资源的 Sun ONE Application Server 实例。
  2. 打开“JDBC”。
  3. 在“JDBC”下,单击“JDBC Resource”。
  4. 在右侧窗格中,单击“New”。右侧窗格中出现用于创建新的 JDBC 资源的页面,如图“创建新的 JDBC 资源”所示。

   创建新的 JDBC 资源
此图显示了可用于创建新的 JDBC 资源的管理界面窗口。

  1. 为创建的资源输入 JNDI 名称。
  2. JDBC 资源存储在 JNDI 系统信息库中,且可以通过 JNDI 名称进行访问。JNDI 名称包含明确的根(位于 Java:comp:env/),因此不需要指定该部分名称。建议将 JDBC 资源(数据源)存储在“jdbc”子上下文之下,因而您的 JNDI 名称将类似于 jdbc/EmployeeDB_DS。

  3. 从“Pool Name”下拉列表的池名列表中,为新的数据源选择池名。所有已注册的连接池都将显示在此下拉列表中。选择的池名将指向命名池定义,该定义将指定数据库连接的各个方面。多个 JDBC 资源可以使用单个池定义。有关如何配置 JDBC 连接池的详细信息,请参见“使用管理界面创建新的 JDBC 连接池”。
  4. 在“Description”字段中,输入描述数据源用途的简短说明。说明不能超过 250 个字符。
  5. 选中“Enabled”复选框,将启用或禁用数据源。数据源不能用于连接数据库,除非已被启用。
  6. 单击“OK”注册新数据源,或者单击“Cancel”取消新数据源。单击取消后,将返回到 JDBC 资源主页面,从中可以再次创建新数据源。

关于 JDBC 连接

Connection 对象表示与数据库的连接。连接会话包括执行的 SQL 语句以及通过该连接返回的结果。一个应用程序可以与一个数据库具有一个或多个连接,该应用程序也可以与多个不同的数据库具有连接。

用户可以通过调用 Connection.getMetaData 方法,获得关于 Connection 对象的数据库的信息。此方法返回一个 DatabaseMetaData 对象,该对象包含数据库的表、数据库支持的 SQL 语法、数据库的存储过程、此连接的功能等方面的信息。

应用程序使用 DataSource 对象生成的 Connection 对象。应用程序通常应包括“finally”块,以确保即使抛出异常也能关闭连接。如果 Connection 对象是加入的连接,这更为重要,因为它可确保始终将有效连接放回到可用连接池之中。下面的代码片段(其中 con 为 Connection 对象)是关闭有效连接的 finally 块的示例。

finally{

if (con != null) con.close();

}

注意,如下面的示例所示,try/catch 块后出现一个 finally 块,其中 ds 是 DataSource 对象。

try {

Connection con = ds.getConnection("user", "secret");

// . . . 执行应用程序的工作的代码

} catch {

// . . . 处理 SQLException 的代码

} finally {

if (con != null) con.close();

}

本节包括以下主题:

关于 JDBC URL

URL(统一资源地址)提供了在 Internet 上定位资源的信息。它可以被视为一种地址。

JDBC URL 提供了一种标识数据源的方法,以便相应的驱动程序识别该数据源并与其建立连接。驱动程序编写者是确定标识特定驱动程序的 JDBC URL 将会是什么的人员。用户不需要关心如何构成 JDBC URL;他们只需使用随所用驱动程序一起提供的 URL。JDBC 旨在推荐一些惯例,以便驱动程序编写者在构造 JDBC URL 时进行遵循。

由于 JDBC URL 用于各种驱动程序,因而这些惯例是(也必须是)非常灵活的。第一,它们允许不同的驱动程序在命名数据库时可以使用不同的模式。例如,ODBC 子协议允许 URL 包含属性值(但并不需要属性值)。

第二,JDBC URL 允许驱动程序编写者对其中包含的所需的所有连接信息进行编码。这样,一个要与指定数据库进行通信的小程序就能够打开数据库连接,而无须用户执行任何系统管理事务。

第三,JDBC URL 允许有间接级。也就是说,JDBC URL 可能会指向由网络命名系统动态转换为实际名称的逻辑主机或数据库名称。这样,系统管理员则无需指定 JDBC 名称中的特定主机部分。有多种不同的网络名称服务,而且没有任何关于使用者的限制。

下面是 JDBC URL 的标准语法。此语法包含三个部分,它们用冒号隔开。

jdbc:<subprotocol>:<subname>

JDBC URL 的三个部分分别说明如下:

  • jdbc - 协议:
  • JDBC URL 中的协议始终是 jdbc。

  • <subprotocol>
  • 驱动程序名称或数据库连接机制名称,可由一个或多个驱动程序支持。子协议名称的突出示例是 ODBC,ODBC 已经被保留用于指定 ODBC 格式的数据源名称的 URL。例如,要通过 JDBC-ODBC 桥访问数据库,用户可能使用一个像 jdbc:odbc:fred 这样的 URL。

    在此示例中,子协议为 ODBC,而子名称 fred 是本地 ODBC 数据源。

    如果想要使用网络名称服务(这样,JDBC URL 中的数据库名称就不必是其实际名称),则该命名服务就可以是子协议。例如,某个用户可能有一个如下所示的 URL:

    jdbc:dcenaming:accounts-payable

    在此示例中,URL 指定本地 DCE 命名服务应将数据库名称应付帐户解析为一个可用于连接真实的数据库的、更为具体的名称。

  • <subname>:
  • 一种标识数据源的方法。根据子协议,子名称可以变化,而且它可以具有驱动程序编写者选择的任何内部语法,包括 sub-subname。subname 的核心是给出用于定位数据源的足够信息。在前一个示例中,fred 就已足够,因为 ODBC 提供了其余的信息。但是,远程服务器上的数据源需要更多信息。例如,如果通过 Internet 访问数据源,就应把网络地址作为 subname 的组成部分包括在 JDBC URL 之中,并应遵守以下标准 URL 命名惯例:

    //hostname:port/subsubname

    假如 dbnet 是一个连接到 Internet 上某个主机的协议,则 JDBC URL 可能看起来像下面的样子:

    jdbc:dbnet://wombat:356/fred

配置 JDBC 连接池

Sun ONE Application Server 允许用户创建命名 JDBC 连接池。JDBC 连接池定义用于创建连接池的属性。池定义是命名的,并且一个定义可以重复使用来配置多个 JDBC 资源。每个命名的池定义都会导致服务器启动时实例化一个物理池。如果两个或更多的 JDBC 资源指向同一池定义,这些资源就会在运行时使用同样的连接池。

您可以使用管理界面和命令行界面创建和配置连接池,如以下各节所述:

使用管理界面创建新的 JDBC 连接池

使用管理界面创建新的 JDBC 连接池的步骤:

  1. 在管理界面的左侧窗格中,打开要为其创建 JDBC 连接池的 Sun ONE Application Server 实例。
  2. 从 Sun ONE Application Server 下列出的 J2EE 服务列表中选择“JDBC”,并打开它下面的“ConnectionPools”标签。您会在管理界面的右侧窗格中看到图“创建新的 JDBC 连接池”。

   创建新的 JDBC 连接池
此图显示了可用于创建新的 JDBC 连接池的管理界面窗口。

  1. 在“Name”字段中,为创建的连接池输入 JNDI 名称。
  2. 选中“Global Transaction Support Enabled”复选框,将对新的连接池启用全局事务支持。能够参加全局事务的连接池称为具有 XA 能力的连接池。
  3. 从“Database Vendor”下拉列表中选择一个数据库供应商,并单击“Next”。您需要在随后显示的屏幕中配置连接池设置。

配置连接池设置

要配置连接池设置,请执行“使用管理界面创建新的 JDBC 连接池”中的步骤 1 到步骤 5。单击“Next”(如步骤 5中所述)后,管理界面的右侧窗格中会出现一个新的页面。它包含以下部分:

  • 常规
  • 属性
  • 池设置
  • 连接验证
  • 事务隔离

在此页的“General”部分中,根据下表中的说明为提供的参数指定值:

   常规设置

参数

说明

Name

 

连接池的名称。

 

DataSource ClassName

 

实现 DataSource 和/或 XADataSource API 的供应商特定类名。

 

Description

 

连接池的说明。

 

在此页的“Properties”部分中,您指定标准和专用 JDBC 连接池属性;其中许多属性为可选。默认情况下,提供所有标准属性的名称。您需要参考数据库供应商的文档,以确定必需的标准特定的属性和供应商特定的属性。

在此窗口的“Pool Settings”部分中,根据下表中的说明为提供的参数指定值:

   连接池设置

参数

说明

Steady Pool Size

 

指定池中必须维持的最小连接数目。连接提供给请求的线程之后,该连接将从池中删除,从而减小了当前的池大小。稳定池大小还与服务器启动时添加到池中的条目数目有关。

 

Max Pool Size

 

指定该池在任何指定时间中允许的最大连接数目。

 

Pool Resize Quantity

 

当池向稳定池大小方向收缩时,将成批调整大小。此值确定批处理的大小。将此值设置过大会延迟连接回收,而将值设置过小则会导致效率太低。注意,池容量每次只增加一个连接,因此该字段不影响池容量的增加。

 

Idle Timeout (secs)

 

连接在池中保持空闲的最长时间(以秒为单位)。超过此时间后,池实现可以关闭此连接。

 

Max Wait tim

 

达到连接超时前呼叫者等待的时间。默认的等待时间很长,即呼叫者可以等待很长时间。

 

在此窗口的“Connection Validation”和“Transaction Isolation”部分中,根据下表中的说明为连接池选择验证方法和事务隔离方法:

   连接验证和事务隔离

参数

说明

Connection Validation Required

 

如果选中此字段,则连接在传递到应用程序前将被验证。这样,如果由于网络出现故障或数据库服务器崩溃造成数据库不可用,应用程序服务器将自动重新建立数据库连接。连接验证将引起额外负担,并会导致性能稍有下降。

 

Validation Method

 

有三种验证数据库连接的方法可供应用程序服务器使用;您需要了解您的数据库的能力,才能确定适当的方法。这三种验证方法为:

  • 自动提交、元数据 - con.getAutoCommit() 和 con.getMetaData() 方法常用来验证连接,遗憾的是,许多 JDBC 驱动程序将这些调用的结果高速缓存起来,因而并不总是可以提供可靠的验证。您应与供应商进行核实,以确定这些调用是否被高速缓存。
  • table:此方法要求应用程序服务器基于用户指定的表格执行查询。实际的查询是“select (count *) from <table-name>”。表必须存在并且可以访问,尽管该表不要求输入任何行的内容。不应使用包含许多行的现有表或经常访问的表。
 

Table Name

 

如果从“Validation Method”下拉列表中选择了最后一种验证选项“table”,则在此处指定表名。

 

Fail All Connections

 

选中此复选框,将使池中所有连接都失败,并在确定某个连接已失败时重新创建这些连接。如果未选中此复选框,则连接仅在被使用时才单独重新创建。

 

Transaction Isolation

 

允许您为此连接选择事务隔离级别。如果未选中该项,池将使用 JDBC 驱动程序提供的默认隔离级别进行操作。

 

Guarantee Isolation Level

 

该项仅在指定了隔离级别的情况下才适用。这可确保从池中获取的任何连接都将具有同样的隔离级别。例如,如果连接在上次使用时,它的隔离级别通过编程方式被更改(例如,con.setTransactionIsolation),则此机制就会将该连接的隔离级别更改回指定的隔离级别。

 

使用命令行界面创建新的 JDBC 连接池

本节通过示例讲述如何使用命令行界面创建 JDBC 连接池。

下表列出创建连接池时需要的所有选项,例如服务器名、密码。下表中使用了样例值。建议在运行本节中介绍的命令之前,设置好 Sun ONE Application Server 的安装所特有的参数。

   使用命令行界面创建 JDBC 连接池时所必需的选项

必需选项说明

样例值

Application server admin user name

admin

Application server admin password

 

adminadmin

 

Application server admin port

 

8888

 

Application server machine name

 

sas.sun.com

 

Application server instance name

 

server1

 

Datasource classname for the connection pool

 

oracle.jdbc.xa.client.OracleXADataSource

注意:使用为其创建连接池的数据库的数据源类名。此实例中使用的数据库为 Oracle。

 

Jdbc resource description Sample

 

Jdbc Resource

 

Connection pool description Sample

 

Jdbc Connection Pool

 

Jdbc resource name

 

jdbc/SampleJdbcResource

 

Connection pool name

 

SampleJdbcConnectionPool

 

Database user name

 

oracle

 

Database password

 

oracle

 

Jdbc connection URL

 

jdbc:oracle:thin:@oracleserver.sun.com:1521:ORA

 

以下示例使用了表“使用命令行界面创建 JDBC 连接池时所必需的选项”中列出的变量。

示例 1:

此示例创建了一个称作 SampleJdbcConnectionPool 的 JDBC 连接池。此示例中使用了一个两步进程创建 JDBC 连接池,如下所示:

步骤 1 - 创建连接池

下面是用于创建 JDBC 连接池的命令行界面语法:

asadmin create-jdbc-connection-pool --user admin_user [--password admin_password] [--host localhost] [--port 4848] [--secure | -s] [--instance instancename] --datasourceclassname classname [--restype res_type] [--steadypoolsize 8] [--maxpoolsize 32] [--maxwait 60000] [--poolresize 2] [--idletimeout 300] [--isolationlevel isolation_level] [--isisolationguaranteed] [--isconnectvalidatereq=false] [--validationmethod auto-commit] [--validationtable tablename] [--failconnection=false] [--description text] [--property (name=value)[:name=value]*] connectionpool_id

例如,以下命令将创建一个称作 SampleJdbcConnectionPool 的连接池。

asadmin create-jdbc-connection-pool --user admin --password adminadmin --host sas.sun.com --port 8888 --instance server1 --restype javax.sql.XADataSource --datasourceclassname oracle.jdbc.xa.client.OracleXADataSource --description "Sample Jdbc Connection Pool" --property User="oracle":Password="oracle":URL="jdbc\:oracle\:thin\:@oracleserver.sun.com\:1 521\:ORA" SampleJdbcConnectionPool



注意

如果要为新的连接池启用“Global Transaction Support”,设置 --restype javax.sql.XADataSource。在 URL 属性中,用 (\:) 替换冒号 (:)



成功创建 JDBC 连接池后,您会看到以下消息:

Created the JDBC connection pool resource with id = SampleJdbcConnectionPool

步骤 2 - 将更改应用到实例

既然已成功创建了 JDBC 连接池,就需要将更改应用到 Sun ONE Application Server 的当前实例。

下面是将更改应用到 Sun ONE Application Server 的实例的语法。

asadmin reconfig --user admin_user [--password admin_password] [--host localhost] [--port adminport] [--secure | -s] [--discardmanualchanges=false|--keepmanualchanges=false] instancename

例如,以下命令将更改应用到 server1,即 Sun ONE Application Server 的实例。

asadmin reconfig --user admin --password adminadmin --host sas.sun.com --port 8888 server1

将更改应用到 Sun ONE Application Server 的实例之后,您就会看到以下消息。

Successfully reconfigured

使用命令行界面管理 JDBC 连接池

可以使用命令行界面来管理 JDBC 连接池及其属性,如本节中所述:

列出连接池。以下命令列出为 server1(即,步骤 2 中使用的 Sun ONE Application Server 的实例)创建的所有连接池。

asadmin list-jdbc-connection-pools --user admin --password adminadmin --host sas.sun.com --port 8888 server1

更改 JDBC 连接池属性。 您可以更改 JDBC 连接池的属性(例如,maxPoolSize 属性),步骤如下:

  1. 运行以下命令,获取为 JDBC 连接池属性 maxPoolSize 指定的值。
  2. asadmin get -u admin -w adminadmin -H sas.sun.com -p 8888 server1.jdbc-connection-pool.SampleJdbcConnectionPool.maxPoolSize

    运行此命令时,您会看到以下结果:

    server1.jdbc-connection-pool.SampleJdbcConnectionPool.maxPoolSize = 32

    通过运行以下命令将 MaxPoolSize 的值更改为 80:

    asadmin set -u admin -w adminadmin -H sas.sun.com -p 8888 server1.jdbc-connection-pool.SampleJdbcConnectionPool.maxPoolSize="80"

    按照说明的方法指定了值之后,您就会看到以下消息:

    Attribute maxPoolSize set to 80

  3. 使用以下命令将更改应用到 Sun ONE Application Server 的实例:
  4. asadmin reconfig --user admin --password adminadmin --host sas.sun.com --port 8888 server1

更改用户属性:在下面的代码样例片段中,您可以将属性“User”从 oracle 更改为 System。

asadmin create-jdbc-connection-pool --user admin --password adminadmin --host sas.sun.com --port 8888 --instance server1 --restype javax.sql.XADataSource --datasourceclassname oracle.jdbc.xa.client.OracleXADataSource --description "Sample Jdbc Connection Pool" --property User="oracle":Password="oracle":URL="jdbc\:oracle\:thin\:@oracleserver.sun.com\:1 521\:ORA" SampleJdbcConnectionPool

  1. 运行以下命令更改 User 属性。
  2. asadmin set -u admin -w adminadmin -H sas.sun.com -p 8888 server1.jdbc-connection-pool.SampleJdbcConnectionPool.property.User="System"

    用户名称已从 Oracle 更改为 System。

  3. 更改用户名之后,运行以下命令来应用您的更改:
  4. asadmin reconfig --user admin --password adminadmin --host sas.sun.com --port 8888 server1

创建一个称作 SampleJdbcResource 的 JDBC 资源。您可以创建 JDBC 资源,详细说明如下。下面是创建 JDBC 资源的语法:

asadmin create-jdbc-resource --user admin_user [--password admin_password] [--host localhost] [--port 4848] [--secure | -s] [--instance instancename] --connectionpoolid id [--enabled=true] [--description text] [--property (name=value)[:name=value]*] jndiname

  1. 运行以下命令,将创建一个称作 SampleJdbcResource 的 JDBC 资源。
  2. asadmin create-jdbc-resource --user admin --password adminadmin --host sas.sun.com --port 8888 --instance server1 --description "Sample Jdbc Resource" --connectionpoolid SampleJdbcConnectionPool jdbc/SampleJdbcResource

    运行此命令时,将创建 JDBC 资源,而且您会看到以下消息:

    Created the external JDBC resource with jndiname = jdbc/SampleJdbcResource

  3. 下面,您需要运行以下命令将更改应用到 Sun ONE Application Server 的实例。
  4. asadmin reconfig --user admin --password adminadmin --host sas.sun.com --port 8888 server1

  5. 运行以下命令,将在实例 server1 中列出所有的 JDBC 资源。
  6. asadmin list-jdbc-resources --user admin --password adminadmin --host sas.sun.com --port 8888 server1

关于连接加入

应用程序可以通过使用 JNDI 查找数据源来获取连接。以下的代码样例片段可用于完成该任务:

InitialContext ctx = new InitialContext();

DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/employee_ds");

获得 DataSource 之后,应用程序组件可根据 J2EE 部署描述符的 <res-auth> 元素中设置的值,用两种方法获得连接。如果此元素的值为 Container,则应用程序可以使用 ds.getConnection() 方法获得连接(即无需指定任何登录信息)。否则,应用程序必须提供登录信息,才能从像 ds.getConnecion.(userName, password) 这样的资源管理器中获得连接。

getConnection() 的所有请求都将从一个池中获得满足。JDBC 连接池将根据 server.xml 中描述的一组参数进行创建。该连接池创建时,池中包含了最初可用的连接数目。因此,池中的当前可用的连接可以满足 ds.getConnection() 请求的需要。下一个请求(如果任何以前的连接都没有被返回到池)将会发现池是空的,并会导致创建新的连接,但不会超出该池指定的最大连接数目的限制。池实现将跟踪创建的连接的数目。如果 getConnection() 请求发现池是空的,或者已创建的连接的数目等于池中最大连接数目,则当前请求将不予满足。此类情况仅会在不可能进行连接共享时发生,而且这种状况会一直保持下去,直到一个连接返回到池中。

当服务器仍然运行时,即使数据库崩溃并又恢复,连接池也将继续正常工作。只有在启用连接验证的情况下,才能实现这一点,如“配置连接池设置”所述。

根据您从“Validation Type”下拉列表中选择的值,池实现程序执行以下参数:

  • 如果选择自动提交作为连接验证类型,系统将通过执行 conn.getAutoCommit() 方法检查连接是否有效。如果该方法不抛出 SQLException,则该连接被视为处于有效状态。自动提交是此参数的默认选项。
  • 如果选择了元数据作为连接验证类型,系统将执行 conn.getMetaData() 方法,检查连接上是否存在元数据,而且如果该方法没有抛出 SQLException,则系统将认为该连接有效。
  • 如果选择表作为连接验证类型,系统将执行查询“Select * From <table-name>”。如果此调用不抛出 SQLException,系统将认为该连接有效。

如果启用 fail-all-connections 属性,则池中的任何连接都将被发现处于无效状态,从而所有连接都将关闭并重新建立。否则,失效和重新建立将不会轻易发生,而仅在使用单个连接时发生。

池实现还可以回收池中所有可用的连接。因此,如果连接处于空闲状态的时间超出了指定的空闲时间,它们将会关闭,从而使池大小达到稳定池大小。如果池极为空闲,则可能导致容器不得不重新建立无效连接,并始终使池中具有稳定的可用连接数目。您在确定是否相对于最大池大小设置稳定池大小时,必须将这一点牢记在心。

监视 JDBC 连接加入

您可能需要定期监视池操作,以确定池大小配置是否有效地工作。下表列出了所有可监视的 JDBC 连接加入参数。

注意,可能会在未来的版本中改进启用监视的工作方式以及可以监视的属性。

   用于监视的 JDBC 连接池参数

属性名称

数据类型

说明

total-threads-waiting

 

整数

 

等待 JDBC 连接的线程的总数。

 

total-outbound-connections

 

整数

 

JDBC 连接验证失败的总数

 

total-connections-timed-out

 

整数

 

请求超时的连接的总数。

 

关于连接共享

当某个 J2EE 应用程序获得的多个连接使用同一资源管理器时,池实现将在同一事务范围内提供连接共享。可通过以下示例理解术语“事务范围”:

Bean_A 启动事务 (Tx1) 并获得连接。然后,Bean_A 调用同一事务 (Tx1) 中的 Bean_B 中的一个方法。现在,如果 Bean_B 使用同样的登录信息从同一 DataSource 获取连接,则很明显,同一连接可以被共享,因为只有 Bean_A 将完成事务。另外,请注意只有在 J2EE 部署描述符中把资源共享范围设置为 Shareable 的情况下,该连接才能共享。如果不希望连接共享,则必须在部署描述符中将资源共享范围设置为 Unshareable。Sun ONE Application Server 提供了连接共享,因为这样可以提高性能。

关于 JDBC 事务

一个事务包含一个或多个已执行、完成然后提交或回滚的语句。方法 commit 或 rollback 被调用时,当前事务将结束且另一个事务开始启动。

默认情况下,新的 Connection 对象通常处于自动提交模式,即语句完成时,将自动对该语句调用方法 commit。在此情况下,由于每个语句分别进行提交,因而一个事务仅包含一个语句。如果已禁用自动提交模式,则在明确调用 commit 或 rollback 方法之前,事务不会终止,因此,该事务将包括上次调用 commit 或 rollback 以来已经执行的所有语句。在第二个示例中,该事务中的所有语句将作为一个组进行提交或回滚。

方法 commit 使 SQL 语句对数据库所做的任何更改都成为永久更改,而且该方法同时释放该事务保持的任何锁定。方法 rollback 将放弃这些更改。

如果一个事务中有两个更新,有时您可能不希望一个更改在某个更新中生效,除非另一个更新也受到影响。这可通过禁用自动提交并将两个更新组合到一个事务中来实现。如果两个更新均成功,则 commit 方法将被调用,这样两个更新的效果将长久保持;如果一个更新失败或两个更新都失败,则 rollback 方法将被调用,从而还原为执行更新前的值。多数 JDBC 驱动程序支持事务。

javax.sql 软件包中的类和接口可以使 Connection 对象成为分布式事务(即,一种涉及与多个 DBMS 服务器的连接的事务)的组成部分。必须由已经实现的 DataSource 对象生成 Connection 对象,才能使用中间层服务器的分布式事务基础结构。与 DriverManager 生成的 Connection 对象不同的是,默认情况下,由这样一个 DataSource 对象生成的 Connection 对象的自动提交模式将被禁用。另一方面,DataSource 对象的标准实现将生成与 DriverManager 类生成的 Connection 对象完全相同的对象。

当 Connection 对象是分布式事务的组成部分时,事务管理器确定何时对 Connection 对象调用 commit 或 rollback 方法。因此,Connection 对象加入分布式事务时,应用程序不应进行任何影响连接开始或结束的时间的操作,例如,调用方法 Connection.commit 或 Connection.rollback,或者关闭该连接的自动提交模式。这些操作会干扰事务管理器对分布式事务的处理。

关于 Java 邮件资源

JavaMail API 允许访问消息存储库中包含的电子邮件消息,并允许使用消息传输创建和发送电子邮件消息。JavaMail API 中包含了对 Internet 标准 MIME 消息的特定支持。访问消息存储库和传输是通过支持特定存储库和传输协议的协议提供者进行的。JavaMail API 规范不要求任何特定的协议提供者,但 JavaMail 包括一个 IMAP 消息存储库提供者和一个 SMTP 消息传输提供者。

JavaMail API 提供了一组定义构成邮件系统的对象的抽象类。API 定义像 Message、Store 和 Transport 这样的类。可以扩展 API,并可将其进一步分类,以提供新的协议并在必要时添加功能。另外,API 提供抽象类的具体子类。这些子类(包括 MimeMessage 和 MimeBodyPart)实现了广泛使用的 Internet 邮件协议。

JavaMail API 很大程度上汲取了 IMAP、MAPI、CMC、c-client 和其它邮件消息传送系统 API 的功能。JavaMail API 支持许多不同的消息传送系统实现,例如,不同的消息存储库、不同的消息格式以及不同的消息传输。JavaMail API 提供了一组定义客户机应用程序的 API 的基类和接口。开发者可以将 JavaMail 类进一步分类,以便提供特定消息传送系统的实现,例如 IMAP、POP3 和 SMTP。

本节包括以下主题:

关于 JavaMail 消息处理进程

JavaMail API 执行以下功能,这些功能构成了典型客户机应用程序的标准邮件处理进程:

  • 创建一个邮件消息,其中包含标题属性集和具有 Content-Type 标题字段中指定的某种已知数据类型的数据块。JavaMail 使用 Part 接口和 Message 类定义邮件消息。它使用 JAF 定义的 DataHandler 对象以包含该消息中的数据。
  • 创建 Session 对象,它验证用户并控制对消息存储库和传输的访问。
  • 将消息发送到其收件人列表。
  • 从消息存储库检索消息。
  • 对检索到的消息执行高级命令。像查看和打印这样的高级命令可通过 JAF-Aware JavaBean 实现。


  • 注意

    目前,JavaMail 框架没有定义支持消息传送、安全性、断开连接操作、目录服务或过滤器功能的机制。



下图说明了 JavaMail API 如何处理消息处理进程:

  
此图显示了 Java Mail API 的消息处理进程
Java Mail API 的消息处理进程

JavaMail API 是通过使用静态工厂方法创建 javax.mail.Session 进行配置的。Sun ONE Application Server 使用 JNDI 请求 Session 对象,并使用 resource-ref 元素在其部署描述符中列出对 Session 对象的需要。JavaMail API Session 对象被视为资源工厂。

JavaMail API 中提供了消息传输,它可以处理类型为 javax.mail.internet.InternetAddress 的地址以及类型为 javax.mail.internet.MimeMessage 的消息。必须正确配置默认消息传输,才能使用 javax.mail.Transport 类的 send 方法发送这样的消息。

JavaMail API 的抽象层声明了旨在支持所有邮件系统支持的邮件处理功能的类、接口和抽象方法。包含抽象层的 API 元素旨在根据需要进行进一步分类以及扩展,以便支持标准数据类型,并且旨在根据需要与消息访问和消息传输协议进行连接。

Internet 实现层使用 Internet 标准(RFC822 和 MIME)实现部分抽象层。

关于 JavaMail 体系结构组件

本节介绍了包含 JavaMail 体系结构的主要组件,其中包括以下主题:

Message 类

Message 类是一种定义一组属性和邮件消息内容的抽象类。Message 类的属性指定寻址信息,并定义内容的结构,其中包括内容类型。内容被表示为封装实际数据的 DataHandler 对象。

Message 类实现 Part 接口。Part 接口定义了要定义并格式化 Message 对象带有的数据内容时,以及要成功地与邮件系统进行连接时所需的属性。Message 类通过消息传输系统添加消息路由所必需的“From”、“To”、“Subject”、“Reply-To”以及其它属性。Message 对象包含在一个文件夹时具有一组与其关联的标志。JavaMail 提供 Message 子类,它支持特定消息传送实现。

消息内容是一个字节集合,或一个字节集合的引用,它们封装在 Message 对象内。JavaMail 不知道消息内容的数据类型和格式。Message 对象通过中间层 JavaBeans Activation Framework (JAF) 与其内容进行交互。此分隔层使 Message 对象可以通过调用相同的 API 方法,处理任何任意内容并使用任何适当的传输协议传输这些内容。消息收件人通常知道内容数据类型和格式,并且知道如何处理该内容。

JavaMail API 还支持多部分的 Message 对象,其中,每个 Bodypart 定义其自己的属性集和内容。

消息存储和检索

消息存储在 Folder 对象中。Folder 对象可包含子对象以及消息,因而提供了一种树状文件夹分层结构。Folder 类声明获取、附加、复制和删除消息的方法。Folder 对象还可以将事件发送到注册为事件监听器的组件。

Store 类

Store 类定义一个数据库,它将文件夹分层结构与其消息结合在一起。Store 类还指定访问文件夹和检索文件夹中存储的消息的访问协议。Store 类还提供建立与数据库的连接、获取文件夹以及关闭连接的方法。实现消息访问协议(IMAP、POP3 等)的服务提供者从对 Store 类进一步分类开始。用户通常通过连接特定的 Store 实现启动和邮件系统的会话。

消息撰写和传输

客户机通过实例化适当的 Message 子类创建新消息。它设置诸如收件人地址和主题这样的属性,并将内容插入 Message 对象。最后,它通过调用 Transport.send 方法发送 Message。Transport 类模仿将消息路由到其目标地址的传输代理。此类提供了将消息发送到收件人列表的方法。对 Message 对象调用 Transport.send 方法会根据其目标地址识别相应的传输。

Session 类

Session 类定义全局属性和每用户邮件相关属性,这些属性定义了支持邮件的客户机与网络之间的接口。

JavaMail 系统组件使用 Session 对象设置或获取特定属性。Session 类还提供一种桌面应用程序可以共享的默认的验证会话对象。Session 类是一个最终具体类。无法对 Session 类进一步分类。Session 类还充当实现特定访问和传输协议的 Store 和 Transport 对象的一个工厂。通过对 Session 对象调用适当的工厂方法,客户机可以获取支持特定协议的 Store 和 Transport 对象。

关于 JavaBeans Activation Framework (JAF)

JavaMail 使用 JavaBeans Activation Framework (JAF),以便封装消息数据并处理用于与这些数据进行交互的命令。与消息数据交互应通过 JAF-Aware JavaBeans 进行,而 JavaMail API 没有提供与消息数据交互功能。

通过使用 JavaBeans Activation Framework 标准扩展,使用 Java 技术的开发者可以利用标准服务确定任意数据段的类型、封装对于该数据段的访问、发现该数据段上可用的操作以及实例化执行上述操作的适当 Bean。例如,如果浏览器获得一个 JPEG 图像,则此框架使浏览器可以将数据流识别为 JPEG 图像,而且根据该数据类型,浏览器可以查找和实例化一个可以操作此 JPEG 图像的对象,或可以查看该图像。

JavaBeans Activation Framework API 支持各种 MIME 数据类型。JavaMail API 必须为和下表所示的 Java 编程语言类型对应的下列 MIME 数据类型,将 javax.activation.DataContentHandlers 包括在内。

   JavaMail API MIME 数据类型到 Java 类型的映射

MIME 类型

Java 类型

Text/Plain

 

java.lang.String

 

Multipart/

 

javax.mail.internet.MIME.Multipart

 

Message/rfc822

 

javax.mail.internet.MIME.Message

 

JavaBeans Activation Framework 将对 MIME 数据类型的支持集成到 Java 平台之中。可以使用 avax.activation.DataContentHandlerobjects 将 MIME 字节流和 Java 编程语言对象相互转换。可以指定 JavaBeans 组件在 MIME 数据上进行操作,例如查看或编辑数据。JavaBeans Activation Framework 还提供一种将文件扩展名映射到 MIME 类型的机制。JavaMail API 使用 JavaBeans Activation Framework 处理电子邮件消息中包括的数据。通常情况下,J2EE 应用程序将不需要直接使用 JavaBeans Activation Framework,然而复杂地使用电子邮件的应用程序可能需要使用此框架。

关于 JavaMail 配置参数

以下配置参数由 Sun ONE Application Server 中的 JavaMail 资源使用。这些配置参数为名称、值对,它们将从 server.xml 文件的 mail-resource 元素中读取。

  • JNDI Name
  • JNDI Name 指定用来从 J2EE 应用程序中参考此邮件资源的名称。

  • Enabled
  • enabled 配置参数指定此邮件资源是否将在 JNDI 树中发布,以及是否可以被参考。如果 J2EE 应用程序参考一项已禁用的资源,该应用程序将会收到 NameNotFoundException 异常。

  • store-protocol
  • 指定默认的消息访问协议。Session.getStore() 方法返回一个实现此协议的 Store 对象。客户机可以覆盖此属性,并用 Session.getStore(String protocol) 方法明确地指定该协议。

  • store-protocol class
  • 指定实现上面指定的存储协议的类名。此类的默认值为 com.sun.mail.imap.IMAPStore。

  • transport-protocol
  • 指定默认的传输协议。Session.getTransport() 方法返回一个实现此协议的 Tranport 对象。客户机可以覆盖此属性,并用 Session.getTransport(String protocol) 方法明确地指定该协议。

  • transport-protocol class
  • 指定实现上面指定的传输协议的类名。此类的默认值为 com.sun.mail.smtp.SMTPTransport。

  • host
  • 指定默认的邮件服务器。Store 和 Transport 对象的连接方法使用此属性来定位目标主机(如果协议专用的主机属性不存在)。

  • user
  • 指定连接到邮件服务器时要提供的用户名。Store 和 Transport 对象的连接方法使用此属性来获取用户名(如果协议专用的用户名不存在)。

  • from
  • 指定当前用户的返回地址。由 InternetAddress.getLocalAddress 方法用来指定当前用户的电子邮件地址。

  • debug
  • 指定初始调试模式。将此属性设置为 True 将会打开调试模式,而将此其设置为 False 则会关闭调试模式。

  • mail-<protocol>-host
  • 指定协议专用的默认邮件服务器。这会覆盖 mail.host 属性。此属性可以根据 store-protocol 属性的值进行设置。如果 store-protocol 的值为 imap 或 POP,您需要分别添加名称为 mail.imap.host 或 mail.pop3.host 的属性。特定属性的值应设置为适合邮件系统配置的值。例如,如果将 store-protocol 设置为 IMAP,property name:mail-imap-host 会带有以下值:spaceduck.acme.com。

  • mail-<protocol>-user
  • 指定用来连接到邮件服务器的、协议专用的默认用户名。这会覆盖 mail.user 属性。因此,此属性根据 store-protocol 属性的值,可能是 mail.imap.user 或 mail.pop3.user。例如,如果将 store-protocol 设置为 IMAP,property name:mail-imap-user 会带有值 fredbloggs。

JavaMail 会话参考的 J2EE 部署描述符

JavaMail 资源使用服务器注册后,任何 J2EE 应用程序组件都可以使用 JNDI 查找对其进行参考。为了部署一个参考资源管理器连接工厂的应用程序,组件提供者必须在标准 J2EE 1.3 部署描述符中声明所有的资源管理器连接工厂参考。

JavaMail 参考的完整 J2EE1.3 描述符元素如下所示:

<resource-ref>

<description>

JavaMail resource used for sending my mail

</description>

<res-ref-name>mail/MyMailSession</res-ref-name>

<res-type>javax.mail.Session</res-type>

<res-auth>Container</res-auth>

<res-sharing-scope>Shareable</res-sharing-scope>

</resource-ref>

Sun ONE Application Server 部署描述符中的项

对于每个参考邮件资源的已部署的组件,部署者必须将组件中使用的资源名称映射为 DataSource 使用命名服务注册的实际 jndi 名称。部署工具有助于部署者容易地进行此映射。此映射注册到 Sun ONE Application Server 特定的 xml 中。下面的示例片段显示了包含此映射的 Sun ONE Application Server 特定的 XML:

<resource-ref>

<res-ref-name>mail/MyMailSession</res-ref-name>

<jndi-name>mail/Session</jndi-name>

</resource-ref>

创建新的 JavaMail 会话

您可以使用管理界面配置 JavaMail 会话。创建和配置新的 JavaMail 会话的步骤:

  1. 在管理界面的左侧窗格中,展开要为其创建新的 JavaMail 会话的 Sun ONE Application Server 实例。
  2. 单击“JavaMail Sessions”。 您会在管理界面的右侧窗格中看到以下窗口,如图“配置 JavaMail 会话”所示:

   配置 JavaMail 会话
此图显示了如何配置 JavaMail 会话。

  1. 在“JNDI Name”文本字段中,为创建的 JavaMail 会话输入 JNDI 名称。Java 邮件资源使用服务器注册后,任何 J2EE 应用程序组件都可以使用 JNDI 查找对其进行参考。
  2. 在“Mail Host”文本字段中,指定默认邮件服务器的 DNS 名称。Store 和 Transport 对象的连接方法使用此属性来定位目标主机(如果特定协议的主机特性不存在)。
  3. 在“Default User”文本字段中,指定连接邮件服务器时要提供的用户名。Store 和 Transport 对象的连接方法使用此属性获取用户名(如果协议专用的用户名不存在)。
  4. 在“Default Return Address”字段中,指定当前用户的默认返回地址。默认地址应为以下格式:username@host。
  5. 在“Description”字段中,为此 Java 邮件会话输入说明。
  6. 选中“Java Mail Session Enabled”复选框,将启用所创建的 Java 邮件会话。
  7. 单击“OK”保存已配置的新的 JavaMail 会话。

配置高级资源属性

您可以使用管理界面为新的 JavaMail 会话配置多个其它属性。属性名和值对取决于所用的邮件协议。您也可以在 server.xml 文件中直接指定这些属性。

配置其它属性的步骤:

  1. 在管理界面的左侧窗格中,展开要修改其 JavaMail 会话配置的 Sun ONE Application Server 实例。
  2. 单击“JavaMail Sessions”。您会在管理界面的右侧窗格(在“创建新的 JavaMail 会话”中解释的主配置部分下面)中看到以下窗口,如图“为 JavaMail 会话配置其它资源”所示:

   为 JavaMail 会话配置其它资源
此图显示了如何为 JavaMail 会话配置其它资源。

  1. 在“Store Protocol”文本字段中,指定要用于此 JavaMail 会话的存储协议,例如,POP3 或 IMAP。
  2. 在“Store Protocol Class”文本字段中,指定已指定的存储协议的类名,如上例所示。
  3. 在“Transport Protocol”文本字段中,指定要用于此 JavaMail 会话的传输协议,例如,SMTP。
  4. 在“Transport Protocol Class”文本字段中,指定已为此会话指定的传输协议的类名,如上例所示。
  5. 选中“Debug Enabled”复选框,将启用此 JavaMail 会话的调试。启用此复选框将打开调试模式。
  6. 单击“OK”保存其它属性配置。

下面代码段是一个完整的邮件资源配置示例:

<mail-resource

jndi-name = "mail/Session"

enabled = "true"

store-protocol = "imap"

store-protocol-class = "com.sun.mail.imap.IMAPStore"

transport-protocol = "smtp"

transport-protocol-class = "com.sun.mail.smtp.SMTPTransport"

host = "gopostal.acme.com"

user = "kingkong"

from = "kingkong@acme.com"

debug = "false">

<property name = "mail-imap-host" value = "spaceduck.acme.com"/>

<property name = "mail-imap-user" value = "fredbloggs"/>

</mail-resource>


上一个      目录      索引      下一个     
Copyright 2003 Sun Microsystems, Inc. All rights reserved.