jaxb注解使用_使用JAXB时
jaxb注解使用
并沒有很多例子可以說明這一點,但是如何在應(yīng)用程序中使用JAXB可以在性能(和內(nèi)存使用)方面產(chǎn)生巨大差異。
這個例子
在此博客文章中,我將使用一個名為Membership的示例對象,看起來像這樣:
我們將使用JAXB將對象與XML之間的封送進(jìn)行封送處理。
在靜態(tài)塊中創(chuàng)建上下文(或至少一次)
我通常看到的最大錯誤是,每個請求都會創(chuàng)建JAXB上下文:
public String marshal(Membership membership){ StringWriter stringWriter = new StringWriter(); try { JAXBContext context = JAXBContext.newInstance(Membership. class ); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); m.marshal(membership, stringWriter); String xml = stringWriter.toString(); stringWriter.close(); return xml; } catch (JAXBException | IOException ex) { throw new RuntimeException(ex); } } public Membership unmarshal(String xml) { try { JAXBContext context = JAXBContext.newInstance(Membership. class ); Unmarshaller u = context.createUnmarshaller(); return (Membership)u.unmarshal( new StringReader(xml)); } catch (JAXBException ex) { throw new RuntimeException(ex); } }(也可參見示例代碼這里 )
這里的問題是創(chuàng)建上下文的JAXBContext.newInstance方法。 上下文僅在對象結(jié)構(gòu)更改時更改,并且僅在代碼更改時發(fā)生,因此我們可以安全地只執(zhí)行一次,因此將其更改為在靜態(tài)塊中創(chuàng)建,如下所示:
public String marshal(Membership memberships){ StringWriter stringWriter = new StringWriter(); try { Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); m.marshal(memberships, stringWriter); String xml = stringWriter.toString(); stringWriter.close(); return xml; } catch (JAXBException | IOException ex) { throw new RuntimeException(ex); } } public Membership unmarshal(String xml) { try { Unmarshaller u = context.createUnmarshaller(); return (Membership)u.unmarshal( new StringReader(xml)); } catch (JAXBException ex) { throw new RuntimeException(ex); } } private static JAXBContext context; static { try { context = JAXBContext.newInstance(Membership. class ); } catch (JAXBException ex) { throw new RuntimeException(ex); } }(也可參見示例代碼這里 )
因此,讓我們看看有什么不同。
批處理示例。
如果我們在一個循環(huán)中(一次一個)將10000個對象與XML相互轉(zhuǎn)換,則結(jié)果如下:
with Bad util Testing 10000 Marshal took: 10804 ms 13762 Unmarshal took: 13762 ms然后加上靜態(tài)塊:
with Good util Testing 10000 Marshal took: 90 ms Unmarshal took: 428 ms那就是將編組速度提高120倍,將編組速度提高32倍!!
( 這里有完整的示例)
并發(fā)示例。
同樣,當(dāng)對多個并發(fā)請求執(zhí)行此操作時,您應(yīng)該看到相同的結(jié)果。 因此,當(dāng)我們將其部署到某個服務(wù)器上(在我的示例中是扎帶 ),并將REST端點暴露給封送和封送時,我們可以使用諸如siege之類的東西來生成并發(fā)流量到服務(wù)器:
錯誤示例的輸出:
Transactions: 255 hits Availability: 100.00 % Elapsed time: 7.91 secs Data transferred: 0.54 MB Response time: 5.13 secs Transaction rate: 32.24 trans/sec Throughput: 0.07 MB/sec Concurrency: 165.52 Successful transactions: 255 Failed transactions: 0 Longest transaction: 6.88 Shortest transaction: 3.47好例子的輸出:
Transactions: 255 hits Availability: 100.00 % Elapsed time: 1.80 secs Data transferred: 0.53 MB Response time: 0.52 secs Transaction rate: 141.67 trans/sec Throughput: 0.30 MB/sec Concurrency: 73.12 Successful transactions: 255 Failed transactions: 0 Longest transaction: 0.78 Shortest transaction: 0.05注意“并發(fā)性”值的差異(并發(fā)性是平均同時連接數(shù),該數(shù)字隨著服務(wù)器性能下降而增加)
( 這里有完整的示例)
當(dāng)文件很大時。
如果輸入文件太大,則可能會收到j(luò)ava.lang.OutOfMemoryError異常。
為了確保可以有效地處理大文件,可以確保在創(chuàng)建輸入時正在使用SAX Parser:
public Membership unmarshalWithSAX(InputStream xml){ try { InputSource inputSource = new InputSource(xml); SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setNamespaceAware( true ); spf.setValidating( true ); SAXParser saxParser = spf.newSAXParser(); saxParser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); XMLReader xmlReader = saxParser.getXMLReader(); SAXSource source = new SAXSource(xmlReader, inputSource); Unmarshaller u = context.createUnmarshaller(); return (Membership)u.unmarshal(source); } catch (ParserConfigurationException | SAXException | JAXBException ex) { throw new RuntimeException(ex); } } private static final String JAXP_SCHEMA_LANGUAGE = " http://java.sun.com/xml/jaxp/properties/schemaLanguage " ; private static final String W3C_XML_SCHEMA = " http://www.w3.org/2001/XMLSchema " ;( 這里有完整的示例)
全部得到
您可以在一個簡單的庫中獲得所有“好”的東西:
在代碼中使用它
(參見https://github.com/phillip-kruger/jaxb-lib )
<dependency> <groupId>com.github.phillip-kruger.jaxb-library</groupId> <artifactId>jaxb-lib</artifactId> <version> 1.0 . 0 </version> </dependency>元帥
JaxbUtil jaxbUtil = new JaxbUtil(); byte [] xml = jaxbUtil.marshal(myJAXBObject);元帥
JaxbUtil jaxbUtil = new JaxbUtil(); MyJAXBObject myJAXBObject = jaxbUtil.unmarshal(MyJAXBObject. class ,xml);獲取JAXB對象的XSD
XsdUtil xsdUtil = new XsdUtil(); String xsd = xsdUtil.getXsd(MyJAXBObject. class );翻譯自: https://www.javacodegeeks.com/2019/05/using-jaxb.html
jaxb注解使用
總結(jié)
以上是生活随笔為你收集整理的jaxb注解使用_使用JAXB时的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 400电话怎么保留(400电话怎么保留号
- 下一篇: vps怎么上传网站程序(vps怎么上传文