JAXBContext 初始化加速?

2022-09-01 14:07:30

有没有办法加快具有大量(>1000)类的javax.xml绑定.JAXBContexts的初始化?在我们的 XML 密集型应用程序中,启动时间约为 10 分钟,主要由 JAXBContexts 的初始化时间组成。:-(

我们在 JDK 1.5 中使用 Sun 的 JAXB 实现,并在 org.jvnet.jaxb2.maven2.maven-jaxb2-plugin 中从 XSD 生成代码。

澄清:问题不在于我们有许多具有相同上下文路径的 JAXBContext 实例,而是问题在于单个 JAXBContext 的初始化需要几十秒,因为它必须加载和处理数千个类。(我们的XSD相当大且复杂。所有 JAXBContext 实例都有不同的上下文路径 - 我们无法进一步减少该数量。


答案 1

JAXB 引用实现具有某种未记录的系统属性,正是出于以下原因:

-Dcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot=true

或者对于包重构之前的旧版本:

-Dcom.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot=true

这指示 JAXB 跳过预先缓存完成工作所需的各种反射肌肉的昂贵过程。相反,它将在使用上下文时执行所有反射。这使得运行时变慢,但初始化速度要快得多,特别是对于大量类。

但是,速度问题的一部分是不可避免的,那就是JAXB必须加载每个类,并且类加载速度很慢。如果您使用相同的配置在第一个上下文之后立即创建第二个上下文,这一点很明显 - 您会发现它已经加载了类,速度要快得多。

另外,您说您有多个 JAXBContext 实例,因为您有多个上下文路径。您是否意识到可以将多个上下文路径放入单个上下文中?您只需要在初始化上下文时将它们全部作为分号分隔的字符串传递,例如

JaxbContext.newInstance("a.b.c:x.y.z");

将加载上下文和 。不过,它可能不会对性能产生任何影响。a.b.cx.y.z


答案 2

通常,您不必创建许多 JAXBContext 实例,因为它们在配置后是线程安全的。在大多数情况下,只有一个上下文就可以了。

那么,创建许多实例是否有特定原因呢?也许有人认为它们不是线程安全的?(这是可以理解的,因为没有明确记录 - 但这是一种非常常见的模式,需要在配置期间进行同步,但只要配置不更改,就不需要在使用过程中同步)。

除此之外,如果这仍然是一个问题,分析瓶颈并在 jaxb.dev.java.net 提交问题(从配置文件中指向热点)将有助于改进事情。JAXB团队非常好,反应迅速,如果你能证明问题在哪里,他们通常会提出很好的解决方案。


推荐