部署不同的体系结构
服务器项目
创建一个名为“TestServerTomcat”的 Tomcat 服务器项目。在此项目内,选择 New Server and Server Configuration,输入“ServerTomcat”作为服务器名(Server name),并且在“Apache Tomcat version 4.1”下选择 Test Environment 作为服务器类型(Server type)。在下一个面板中,指定 TOMCAT_HOME 作为安装 Tomcat 的目录,并且指定适当的 JDK 位置设置。请参见图 7。
图 7. 服务器 Tomcat 设置
创建服务器项目“TestServerWAS”。在此项目中,创建服务器“ServerWAS”并接受所有的缺省值。(具体情况请参见 “Hello World”J2EE 应用程序文章)。
最后,您的工作台看起来应该是这样的:
图 8. 具有所有项目的工作台
现在,我们可以将项目添加到服务器并测试 J2EE 应用程序。
部署 All-in-One-All-Local 体系结构
要部署这种体系结构,您需要遵循下列步骤:
a.将 DualEARForAllInOne 添加到 WebSphere application Server 配置。打开服务器配置编辑器,输入必要的设置;例如,将类路径设置为项目文件夹。由于我们稍后将进行性能测试,所以最好同时更改某些环境设置;例如,将 java VM 参数设置为 -Xms512M -Xmx512M,禁用通用测试客户端(universal test client)等等。
b.更改某些数据源设置也是有必要的。现在,从提供者列表中删除“Cloudscape”,并且为“Default DB2”提供者添加版本 5.0 的数据源。接受所有的缺省值,并且指定 dualDB 作为“databaseName”资源特性值。在服务器配置编辑器的 EJB 选项卡上,将缺省数据源设置为 Data source 1。
c.返回到 DualEJBModule01 EJB 部署描述符编辑器。对于 DualEntity Bean,将“CMP Connection Factory JNDI name”的值设置为 jdbc/ds1,并且将“Container authorization type”设置为 Per_Connection_Factory。
d.对于初始测试,确保 DualEJBModule02 的 web.xml 和 ejb-jar.xml 中的“useLocal”设置为 true。
e.发布并启动 ServerWAS。
f.通过 Web 浏览器导航到 URL http://localhost:9080/DualWebModule03。您应该看到索引页面,带有显示的表单。
图 9. 索引和结果页面
g.现在,您可以测试整个 J2EE 应用程序,并且在 Application Developer 中观察控制台消息。
部署 All-in-One-All-Remote 体系结构
部署这种体系结构不需要更改项目设置。然而,要在相同的部署(实现 All-in-One-All-Remote)中转换到远程接口,您需要将 DualEJBModule02 的 web.xml 和 ejb-jar.xml 中的“useLocal”设置值更改为 false。
部署分离容器(Separate Containers)体系结构
要实现这种体系结构,您需要从“ServerWAS”配置中删除 DualEARForAllInOne 项目,并且将 DualEARForEJBContainer 添加到它,然后,将 DualWebModule03 项目添加到“ServerTomcat”配置。指示 Servlet 使用特定的 URL 来定位 EJB(通过取消 web.xml 中相关参数设置的注释)。在 ejb-jar.xml 中将“useLocal”设置为 true,以便实现 WebSphere Application Server 中的 EJB 容器内的最快通信。在启动服务器之前,我们必须为 Tomcat 设置环境。打开 Tomcat 服务器编辑器,选择 Environment 选项卡以设置“Class Path”:
·添加变量:${WAS_50_PLUGINDIR}/PRoperties。
·添加文件夹:DualEJBModule02/ejbModule、DualJavaModule00。
·对于 Tomcat 类加载器,我们需要 Enterprise JavaBeans 类和接口(通常包含在 javax.ejb 包内)。对于 Tomcat,将标准的 j2ee.jar 放入类路径可能会引起已知的不兼容性问题,因为 javax.servlet 包出现在 j2ee.jar 和 servlet.jar 这两个文件中。避免这个问题的惟一方法是创建一个新的 j2ee-modified.jar,只包含必要的与 EJB 有关的类(通过下载的文件提供)。将此文件添加到“External JAR”选项中。
·将“Java VM Arguments”设置为 -Xms256M -Xmx256M。
要启动该应用程序,您必须首先启动 ServerWAS,然后启动 ServerTomcat。将浏览器指向 http://localhost:8080/DualWebModule03 来查看索引页面,因为 Tomcat 使用端口 8080 作为 HTTP 的缺省端口。
使用简单的 Java HTTP 测试客户端进行测试
现在,我们将通过一个简单的 Java HTTP 测试客户端(通过下载的文件提供)来进行某些性能测试。测试客户端测量测试的持续时间内平均的响应时间和成功的采样数(即得到了响应的采样数)。要启动测试客户端(一个带有简单的自解释 GUI 的 Java 应用程序),可以运行 start.bat。该 URL 应该对将要测试的体系结构是有效地。选择 Set,然后选择 Start。当测试完成时,结果将显示在带颜色的文本区中。
图 10. 简单的 Java HTTP 测试客户端
测试客户端产生指定的线程数,每个线程都通过它自己的 URL 对象提供。该客户端生成 HTTP GET 和 POST 请求,带有在 init.properties 文件中定义的参数(在 client.jar 文件中提供)。id 请求参数值是由随机数生成器计算出来的整数,而 firstName 和 lastName 请求参数是由从预定义的 String 数组挑选的元素创建的。该客户端使用 GET 请求来在“Set”模式下测试 URL,然后它使用 POST 请求来进行实际的性能或负荷测试。每个请求都发送一个请求,再等待响应,然后发送另一个请求到服务器,如此等等。测试结果将在下一部分进行讨论。别忘了在启动测试之前禁用 web.xml 和 ejb-jar.xml 中的跟踪!
性能测试结果及分析
测试设置
与开发人员的机器中的典型环境相比,测试设置中并没有什么非凡之处。我们用于测试的计算机的配置为 Intel Pentium III 处理器、1 GHz 和 1.5GB 的 RAM、windows 2000、DB2 V8.1、WebSphere Studio Application Developer Version 5.1、Tomcat 4.1.29 和 IBM JDK 1.3.1(带有已启用的 JIT)。因此,为了进行测试设置,所有的服务和应用程序都应该已运行在相同的单处理器计算机中。
我们所进行的测试有两种类型:单线程和多线程(上述体系结构中的每一个都有 100 个线程)。为了获取可复验的结果,每种测试设置在客户端上都有一系列运行。在这些系列中第一次运行的结果被认为没有代表性,运行测试以使 JVM 和服务器“预热”。在每次测试运行之后便删除数据库 PERSON 表中的所有记录。单次测试运行一般持续的时间通常为 10 分钟。对于分离容器(Separate Containers)体系结构,为了进行多线程测试,Tomcat 的 server.xml 中的设置需要作如下调整:
...
<Connector acceptCount="10"
className="org.apache.coyote.tomcat4.CoyoteConnector"
connectionTimeout="20000"
debug="0" enableLookups="false"
maXProcessors="200" minProcessors="200"
port="8080" redirectPort="8443"
useURIValidationHack="false"/...
不需要进行重要的数据库或服务器调整。
结果
实际的测试结果显示在下表中。重要的是相对数而不是绝对数本身。一般来说,本地和远程接口的性能结果与预览有很好的一致性。(同时参见参考资料。)在我们的测试中,多线程吞吐量一般要低一些,因为每个 JVM 都必须在相同的单处理器计算机中分派多线程。对于这个样本应用程序,请求处理时间比较少,所以线程分派和时间安排相当大程度上是在整个处理时间中共享的,因而增加了响应时间。
图 11. 单线程客户端的平均响应时间
图 12. 多线程客户端的平均响应时间
图 13. 单线程客户端的吞吐量
图 14. 多线程客户端的吞吐量
结束语
本文展示了样本 J2EE 应用程序的设计方法、实现和测试结果,提供了 Enterprise Java Bean 的本地和远程接口使用的基本比较。公开 EJB 的本地和远程接口并不会限制 J2EE 应用程序部署中的灵活性。这两种接口使您可以改变部署场景而不用更改应用程序的源代码,并且还使您可以利用所选的任何部署体系结构。当本地接口用在相同的 JVM 中时,性能是最优的。使用分离容器(Separate Containers)体系结构性能可能会降低。对于确定的 J2EE 设计模式,我们推荐通过创建处理本地和远程接口的代码来将两种接口同时用于会话 Bean(有时用于实体 Bean),以达到最大的效率,而进行很少的额外工作。
关于作者 Sheldon Wosnick 是 IBM 多伦多实验室的 WebSphere Studio Application Developer Server Tools 小组中的一名顾问软件开发人员。他和他的队员们负责 WebSphere Studio 产品家族的整个服