当前位置: 首页 > 面试题库 >

JAXBContext初始化加速?

丌官盛
2023-03-14
问题内容

有什么方法可以通过大量(>
1000)类来加快javax.xml.bind.JAXBContexts的初始化?在我们的XML繁重的应用程序中,启动时间约为10分钟,并且主要由JAXBContexts的初始化时间组成。:-(

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

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


问题答案:

正是由于这个原因,JAXB参考实现具有未记录的系统属性:

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

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

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

这指示JAXB跳过预缓存完成该工作所需的各种反射肌肉的昂贵过程。相反,它将在使用上下文时进行所有反射。这会导致运行速度变慢,但初始化速度却大大加快,尤其是对于大量类而言。

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

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

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

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



 类似资料:
  • Initialization 初始化 Although it doesn’t look superficially very different from initialization in C or C++, initialization in Go is more powerful. Complex structures can be built during initialization a

  • 初始化是为类、结构体或者枚举准备实例的过程。这个过需要给实例里的每一个存储属性设置一个初始值并且在新实例可以使用之前执行任何其他所必须的配置或初始化。 你通过定义初始化器来实现这个初始化过程,它更像是一个用来创建特定类型新实例的特殊的方法。不同于 Objective-C 的初始化器,Swift 初始化器不返回值。这些初始化器主要的角色就是确保在第一次使用之前某类型的新实例能够正确初始化。 类类型的

  • new iSlider(DOM, DATA, OPTIONS) Name Type Description DOM dom 容器dom节点 DATA Array 数据列表 OPTIONS Object 配置项 DOM new iSlider(DOM, DATA, OPTIONS); {HTMLElement} 容器dom节点 作为第一个参数并不是必须的,会被OPTIONS.dom覆盖,但是这十分必

  • 确认初始化操作 1)初始化操作用来清空此统计ID的统计数据 2)与启用新的统计ID不同的是,初始化操作使您不需更换网站上的统计代码就可以重新开始统计 注意:初始化操作将清除此统计ID的所有统计数据,此操作不可恢复!!!

  • 创建版本库 git 基于文件夹(工作树)进行版本控制,在一个文件夹中创建 git版本库: $ cd project/ $ git init Initialized empty Git repository in .git/ 输出信息:在当前文件夹的 .git/ 目录下创建版本库 将文件提交到 git索引: git add file1 file2 file3 …… 更方便的作法是

  • 1. 引入sdk 下载wechat-mudu.min.js到小程序项目,建议放utils目录下 const Mudu = require('./utils/wechat-mudu.min') 2. 设置小程序code获取session_key地址 本方法已废弃 sdk会在初始化的时候获取用户的微信资料并设置到目睹平台,所以需要设置该地址用户获取用户openid, 详见用户 Mudu.setOp