您的位置:首页 > 其它

JAX-RPC vs JAX-WS(二):用JAX-WS 2.0实现高性能的Web服务(续)

2006-11-01 15:18 871 查看
Primitive Array Performance
就像你在基本类型的例子中所注意到的,那个例子并没有强调绑定层。如果你来回发送的只是基本类型的数据,那么基本类型的性能就被容器的性能隐藏了,比如说连接方面的处理,任务时序的安排,等等。这部分展示了当强调绑定层时基本的数组类型的执行情况。这是一种从容器层移到绑定层的一种放大透镜。(This is a way of moving the magnifying lens from the container layer to the binding layer)
考虑下WSDL Sample 2的代码。


WSDL Sample 2

<xsd:complexType name="intArray">
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="unbounded" ref="types:echoInt"/>
</xsd:sequence>
</xsd:complexType>

<xsd:element type="types:intArray" name="echoIntArray" />
<xsd:element type="types:intArray" name="echoIntArrayResponse" />

...

<message name="echoIntArraySoapIn">
<part name="params" element="types:echoIntArray" />
</message>
<message name="echoIntArraySoapOut">
<part name="result" element="types:echoIntArrayResponse" />
</message>
WSDL Sample 2中的WSDL代码展示了发送跟接收整数类型数组。Code Sample 2显示了针对JAX-RPC1.1相应的Web服务代码。
Code Sample 2
public int[] echoInt(int[] params)
{
return params;
}
Code Sample 3显示了针对JAX-WS 2.0而产生的代码。
Code Sample 3
public void echoIntArray(Holder<List<Integer>> echoInt)
{

}
Table 2展示了JAX-RPC 1.1跟JAX-WS 2.0之间在服务端点上,对于相应所产生的带有minOccurs和maxOccurs属性的XSD基本类型的不同Java数组类型的区别。

Table 2: Comparison of Primitive Arrays Generated in JAX-RPC 1.1 and JAX-WS 2.0 for the Corresponding XSD Types


XSD Type
JAX-RPC 1.1
JAX-WS 2.0
xsd:boolean
Boolean[]
List<Boolean>
xsd:short
Short[]
List<Short>
xsd:int
Int[]
List<Integer>
xsd:long
Long[]
List<Long>
xsd:integer
BigInteger[]
List<BigInteger>
xsd:float
Float[]
List<Float>
xsd:double
Double[]
List<Double>
xsd:decimal
BigDecimal[]
List<BigDecimal>
xsd:date
Java.util.calendar[]
List<Javax.xml.datatype.XMLGregorianCalendar>
xsd:time
Java.util.calendar[]
List<Javax.xml.datatype.XMLGregorianCalendar>
xsd:datetime
Java.util.calendar[]
List<Javax.xml.datatype.XMLGregorianCalendar>



注意到JAX-RPC 1.1所产生的带有索引的数组,而JAX-WS 2.0产生的是list接口。
图 5中的图表表现出了XSD基本数组类型上的性能。X轴指的XSD基本数组类型比如说元素类型为boolean,short等等的Array(size=100)。Y轴指示了吞吐量,每秒钟的处理事务。



5: 基本数组类型性能

就像你所看到的,一旦你开始强调绑定层了,基本类型的性能就不同了。并且注意下JAX-WS 2.0在所有情况下都表现得更好并且可以看出来有很大的提高了――在某些情况下差不多是一倍多――在date,time,和datetime的情况下。JAX-RPC针对datetime的锁问题现在在JAX-WS 2.0已经被提出了。
图 5展示了JAX-WS 2.0在性能上的提升。

Payload Performance
Web服务性能是跟发送的有效载荷成正比的。你发送的有效载荷越多,对于序列化及反序列化来说就需要多处理更多的东西,还有绑定及解析。这些对性能上的影响是相当大的。
假设有一种情况,你必须发送并接收带有Code Sample 4中所表示的item结构的items。比如说,在一个供应链管理系统中,你会为了一个特殊的订单而请求line items来处理一批items。
Code Sample 4
# Item{
id,
description,
price,
inventory,
# location {
id,
description,
address,
},
creationdate
} ;
图 6中的图表表明了JAX-WS的性能跟JAX-RPC相比在作为有效负荷大小百分比上――那就是说,items的数量――种类。X轴代表了发送跟接收的取决于items数量。在这个问题里(比如说一个),一个事务被定义为发送与接收一个itmes的数组。


6: Payload Performance
图6中的图表暗示出来了,在负载超过100个items后,JAX-WS的产出是JAX-RPC性能上的差不多两倍,而在负载不多于100个items的时候,JAX-WS和JAX RPC结果是差不多的。一般来说,JAX-WS比JAX-RPC在更多的负载下表现得比JAX-RPC更好。

Binding Performanc
在Java的web服务中,有多种方式来处理XML文档。这部分比较了document-handling JAXB,Document Oject Model(DOM)c对于XML文档来说,性能上的区别,100 kilobyte Universal Business Language (UBL) invoice.
JAXB Binding
JAXB绑定提供了一种从Java技术的对象到XML以及从XML到Java技术对象的转换方式。JAXB 绑定的语法在WSDL Sample 3中的示例体现了,在这里一个叫做echoJAXB的元素在WSDL代码的Schema部分指的是InvoiceType。这种途径也叫shcema绑定,因为产性的制品都是依赖于这个schema。

WSDL Sample 3
<xsd:element name="InvoiceType">
...
</xsd:element>
<xsd:element name="echoJAXB" type="types:InvoiceType" />
当在Code Sample 5中的WSDL代码使用wscomplie被编绎的时候,它在服务端点产生了InvoiceType的Java技术的对象。
Code Sample 5
public void echoSX(Holder<InvoiceType> invoice) {

}
JAXB绑定有几个优点:减轻了开发任务,隐藏了复杂代码,缺少了样板代码,而且比非schema绑定的具有更好的性能。所有开发人员都需要做的就是为访问XML内容而产生JAXB java类方法。

JAXB的一个缺点就是所产生的Java代码更加耦合于在WSDL中定义的schema,这使得JAXB绑定的途径对于写基本的代码更加难。

DOM Binding
DOM绑定提供了从一棵DOM树到XML和从XML到DODM树的转换。DOM树绑定的语法如Code Sample 6所示,在这里一个叫做echoDOM的元素在WSDL的Schema部分有一个xsd:any类型,它允许应用程序发送任意的XML数据。在xsd:any类型上的processContents="skip"属性意思是XML内容是不合法的。 这种方法也叫nonschema binding因为所产生的代码是不依赖于shema的。
Sample 4
<xsd:element name="echoDOM">
<xsd:complexType>
<xsd:sequence>
<xsd:any processContents="skip" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
当使用wscompile进行编绎时,在WSDL Sample 4中的代码就会在服务端点产生DOM Element ,如Code Sample 6所示
code Sample 6
public EchoNSXResponse echoNSX(EchoNSX invoice) {
Element e = (Element)invoice.getAny();
EchoNSXResponse res = new EchoNSXResponse();
res.setAny(e);
return res;
}
DOM绑定的优点就是它允许开发人员写更加基础和有可扩展性的程序。DOM绑定的缺点就是它需要开发人员依赖于schema写更加复杂的代码并且为了遍历一个DOM树需要开发人员写更多的模板文件
,这就会导致性能上的降底。注意Code Sample 6, 只有那些基础结构的性能被测量了(infrastructural performance is measured)而没有汲及到用户代码或者是业务逻辑上的代码。
在这种使用情况,, a transaction is the sending and receiving of a 100 kilobyte UBL invoice XML document如图7,X轴代表了绑定类型,y轴代表了吞吐量。注意:图 7所示的图表是对端点的性能,也就意味着它测量的仅仅是服务器端的web服务栈。




7: 绑定性能

图7所示的图表说明了JAXB绑定比DOM绑定表现地更好。而且,注意到JAX-WS的性能比JAX-RPC的性能好很多.另外,JAX-WS的性能在DOM绑定的情况下更有明显。
总结


总的来说:
取决于需求选择基本类型—比如说digits, precision的位数,等等――因为基本类型能够基于他们的使用影响到性能。
在负载量增大的情况下将会减少吞吐量,并且会对性能产生相当大的影响。
JAXB绑定或者是schema绑定提供了比DOM或者是非schema绑定更加好的性能。
JAX-WS 2.0比JAX-RPC1.1有更加好的绑定性能。
对于大的负载量来说,JAX-WS 2.0的性能大约是JAX-RPC 1.1的两倍。
For More Information



Java API for XML Web Services (JAX-WS) 2.0


Java API for XML-Based RPC (JAX-RPC) 1.1


WSTest Benchmark


GlassFish Java EE Application Server


JAX-WS Project


JAX-RPC Project


JAXB 2.0 Project
(完)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: