首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在作为jar/war运行的Spring Boot应用程序中,JAXB解组非常慢

在作为jar/war运行的Spring Boot应用程序中,JAXB解组非常慢
EN

Stack Overflow用户
提问于 2021-09-24 12:34:12
回答 1查看 281关注 0票数 2

由于我们调用的是遗留API,因此需要使用JAXB对接收到的数据进行解组。

但在2周内,整个过程确实需要2-3倍的时间。此区域中的代码未更改,依赖项相同,docker基础图像相同。

在我本地的开发环境中,我没有问题。这个问题在我们的openshift服务器上是可见的。

来自我们呼叫的端点的同事发现他们的绩效指标没有区别。

这是基本的代码:

代码语言:javascript
复制
JAXBContext jaxbContext = jaxbContexts.get(ProductsResponse.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
ProductsResponse result = unmarshaller.unmarshal(new StringReader(xmlStr));

上下文被缓存,createUnmarshaller应该是一个轻量级操作,就像这里JAXB creating context and marshallers cost所描述的那样。

但是大部分时间都被浪费在创建SAXParser的解组过程中。

..。

我不知道是什么导致了这个问题。我们目前正在努力用支持JAXB注释的Jackson XMLMapper替换JAXB。但由于API中的一些奇怪的结构,这导致了更多的问题。

商务人士越来越不耐烦了。我不知道..。

EN

回答 1

Stack Overflow用户

发布于 2021-09-24 12:34:12

我们发现了一个问题。我想在这里与你分享解决方案。

当我使用java -jar从构建的war文件运行spring boot应用程序时,我可以重现这个问题。从我本地的windows机器上。unmarshaller.unmarshal花了大约20秒

在我看来,一些SAX或Xerces类是由WebappClassLoader加载的,它使用org.apache.catalina.webresources.Cache。但不知何故,从war文件中为每个操作加载了类。

正如这里所描述的,Tomcat 8 throwing - org.apache.catalina.webresources.Cache.getResource Unable to add the resource的缓存可能会很小。

使用此代码,我将大小从10 mb增加到100 mb。

代码语言:javascript
复制
@Bean
public WebServerFactoryCustomizer prodTomcatCustomizer()
{
    return (WebServerFactoryCustomizer<TomcatServletWebServerFactory>) factory -> factory.addContextCustomizers(
      context -> {
          final int cacheSize = 100 * 1024;
          StandardRoot standardRoot = new StandardRoot(context);
          standardRoot.setCacheMaxSize(cacheSize);
          context.setResources(standardRoot);
      });
}

它解决了这个问题。多年以来我看到的最好的图表:

不是100%确定是什么导致了这个问题。也许其他一些开发只是导致缓存已满,这导致在每次解组操作时从war文件加载这些类时出现大量的性能问题。

我希望这能帮助那些在使用jaxb和spring boot时遇到性能问题的人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69315104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档