由于我们调用的是遗留API,因此需要使用JAXB对接收到的数据进行解组。
但在2周内,整个过程确实需要2-3倍的时间。此区域中的代码未更改,依赖项相同,docker基础图像相同。
在我本地的开发环境中,我没有问题。这个问题在我们的openshift服务器上是可见的。
来自我们呼叫的端点的同事发现他们的绩效指标没有区别。
这是基本的代码:
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中的一些奇怪的结构,这导致了更多的问题。
商务人士越来越不耐烦了。我不知道..。
发布于 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。
@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时遇到性能问题的人。
https://stackoverflow.com/questions/69315104
复制相似问题