Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XML解析太慢了!_Java_Xml_Parsing_Optimization_Xml Parsing - Fatal编程技术网

Java XML解析太慢了!

Java XML解析太慢了!,java,xml,parsing,optimization,xml-parsing,Java,Xml,Parsing,Optimization,Xml Parsing,我编写了一个java应用程序,使用XML与web应用程序通信。部署之后,我发现解析web应用程序生成的XML需要花费太长时间 例如,登录大约需要2分钟;登录信息包含在url中。web应用程序使用返回的XML进行处理并响应Java应用程序,以确定登录是否成功 我使用了标准的JavaDOM解析 有什么方法可以优化这个过程,使活动更快吗?解析方法需要花费所有的时间,因为它正在等待来自其他应用程序的输入。你需要把两者分开,这样你才能看到发生了什么。将另一个应用程序中的XML读入ByteArrayOutp

我编写了一个java应用程序,使用XML与web应用程序通信。部署之后,我发现解析web应用程序生成的XML需要花费太长时间

例如,登录大约需要2分钟;登录信息包含在url中。web应用程序使用返回的XML进行处理并响应Java应用程序,以确定登录是否成功

我使用了标准的JavaDOM解析


有什么方法可以优化这个过程,使活动更快吗?

解析方法需要花费所有的时间,因为它正在等待来自其他应用程序的输入。你需要把两者分开,这样你才能看到发生了什么。将另一个应用程序中的XML读入ByteArrayOutputStream,然后在读入完成后,将输出流复制到输入流(可以使用commons io),并将其提供给解析器。然后看看到底花了多少时间


您可以优化的一件事是登录过程。您可以使用LDAP服务器进行身份验证,LDAP针对读取进行了优化,您可以使用JNDI访问它。

使用标准XML解析器,短消息应该在大约1毫秒内解析。使用自定义解析器,您可以将其缩短到20微秒左右。任何比这更长的时间都不是在XML解析中,@Nathan所说的,而且我建议在花这么多时间的时候做一些。 我在过去遇到过这种情况,发现并不是解析需要花费时间,而是在解析时创建和操作数据结构。
您可能会看到一些不同的东西,但很可能这是一个惊喜。

我遇到了同样的问题,并通过关闭DocumentBuilder默认情况下将执行的所有验证来设法加快解析器的速度:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

factory.setNamespaceAware(false);
factory.setValidating(false);
factory.setFeature("http://xml.org/sax/features/namespaces", false);
factory.setFeature("http://xml.org/sax/features/validation", false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

// then take a builder via `factory.newDocumentBuilder()` and parse doc with that builder

首先,请选择一个有效的问题标题。在苏俄,问题问你们!这里的关键是你需要分析你的代码。代码的某些部分存在瓶颈。一旦你确定了这些,你很可能已经到了可以进行优化的地步。“诀窍在于知道在哪里进行优化。”博兹霍更新了帖子@yomexzo粘贴代码。最可能的情况是,您的webapp响应时间太长,或者您有某种网络延迟。使用大写字母I,尽量避免不必要地使用省略号(…)。你的意思是你不理解我的问题吗?我只是认为与服务器执行事务大约需要5秒钟。。。。大约有5个这样的事务会导致应用程序启动缓慢。。。。这一次太多了。。。。我该怎么办?????我尝试过使用SwingUtilities.invokeLater()并尝试在登录事务之后的后续事务中使用线程,以便应用程序JFrame至少显示。。。。不幸的是,JFramehangs@yomexzo当前位置拍摄stackshots时,您看到了什么?等待发送/接收完成的样本百分比是多少?操作数据结构(创建、销毁、初始化、复制、通知、注册)的百分比是多少?他们中有没有人做了你没想到的其他事情,比如日志记录?他们会告诉你你可能没有想到的实际花费的时间。然后就很清楚你的选择是什么,它们能为你节省多少。只是计算一下,与服务器执行一个事务大约需要5秒钟。。。。大约有5个这样的事务会导致应用程序启动缓慢。。。。这一次太多了。。。。我该怎么办?????我尝试过使用SwingUtilities.invokeLater()并尝试在登录事务之后的后续事务中使用线程,以便应用程序JFrame至少显示。。。。不幸的是,JFramehangs@yomexzo,你知道吗?一个人的问号越多,他们得到的答案就越快越好!只是计算了一下,与服务器执行一个事务大约需要5秒钟。。。。大约有5个这样的事务会导致应用程序启动缓慢。。。。这一次太多了。。。。我该怎么办?????我尝试过使用SwingUtilities.invokeLater()并尝试在登录事务之后的后续事务中使用线程,以便应用程序JFrame至少显示。。。。不幸的是,JFrame挂起调用器仍然使用GUI线程,因此它仍然会锁定GUI。我建议您使用另一个线程来触发后台任务。真正的问题似乎是您的服务器太慢。100毫秒应该足够长,可以完成一项简单的任务。你需要调查你的服务器正在做什么,看看是否可以修复。你应该能够得到一个线程转储,看看你的GUI线程正在等待什么。谢谢,正是我刚才遇到的问题!你为我节省了时间:)上面的前4个调用是多余的:前2个默认为false,后2个由前2个定义。我的问题是:我的代码花了40秒来获取新的
DocumentBuilderFactory.newInstance()
关闭验证将如何帮助代码加速!!