Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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 Web启动导致执行缓慢_Java_Apache Poi_Java Web Start_Jnlp - Fatal编程技术网

Java Web启动导致执行缓慢

Java Web启动导致执行缓慢,java,apache-poi,java-web-start,jnlp,Java,Apache Poi,Java Web Start,Jnlp,我有一个使用JavaWebStart部署的应用程序。当我进行单元测试时,我注意到一个小问题:每当我的应用程序使用JavaWebStart运行时,一个特定的操作需要很长时间才能执行。但是,当在本地运行时,速度相当快 我所说的特定操作是读取一个大的(5k行)Excel文件来解析它。这是代码行: Workbook wb = WorkbookFactory.create(new FileInputStream(new File(inputFile.getText()))); 为了解决这个问题,我添加了

我有一个使用JavaWebStart部署的应用程序。当我进行单元测试时,我注意到一个小问题:每当我的应用程序使用JavaWebStart运行时,一个特定的操作需要很长时间才能执行。但是,当在本地运行时,速度相当快

我所说的特定操作是读取一个大的(5k行)Excel文件来解析它。这是代码行:

Workbook wb = WorkbookFactory.create(new FileInputStream(new File(inputFile.getText())));
为了解决这个问题,我添加了一种记录时间的方法:

long time1 = System.currentTimeMillis();
Workbook wb = WorkbookFactory.create(new FileInputStream(new File(inputFile.getText())));
long time2 = System.currentTimeMillis();
long diff = time2 - time1;
double seconds = (double)diff / (double)1000;
DecimalFormat df = new DecimalFormat("#,##0.00");
System.out.println("Elapsed Time: " + df.format(seconds) + " seconds.");
这就是输出:

(本地)

(JavaWebStart)

但是,紧接着的后续运行(在Java Web Start上)会产生以下结果:

Elapsed Time: 1.61 seconds.
我怀疑这与POI库有关(特别是读取POI所需的库的大小,更具体地说,是13MB
ooxml-schemas-1.0.jar
library文件)。所以,我的问题是:假设是库的大小,有什么方法可以防止这种情况发生吗?我已经通过控制面板打开了库缓存,那么为什么它似乎需要缓存库呢?一旦加载,它就很快了。但第一次要花很长时间

下面是控制面板的图像,显示我允许它存储库:

以前有人见过这种行为吗?没有SSCCE因为。。。那么,如何发布带有Java Web Start问题的SSCCE呢?

根据任何结果,您应该仔细检查
.jnlp
元素中指定的属性,并将它们与开发环境中的属性进行比较。特别是,请查看影响性能的因素,例如堆大小和VM类型:


我发现有两件事帮不上忙。不确定他们是否能解释全部差异,但至少有一些

首先,排队

WorkbookFactory.create(new FileInputStream(new File(inputFile.getText())));
您有一个非常好的文件对象,现在您正在浪费大量的时间和资源将其缓冲到内存中。正如,如果你有一个文件,直接使用它!切换到以下位置将节省时间和内存:

其次:

poi ooxml需要poi ooxml架构。这是ooxml模式jar的一个小得多的版本。。。较大的ooxml模式jar通常仅用于开发


因此,除非您有一些非常特殊的需求,否则请将完整的
ooxml模式
jar切换到更小的
poi ooxml模式
jar,这将涵盖所有常见用例。这将使您的加载速度更快。

如果您在jnlp中错误地将download属性设置为lazy,您应该声明您希望立即下载此库

<resources>
        <jar download="eager" href="uploads/lib/guice-multibindings-3.0.jar"/>
</resources>

这意味着它们将在应用程序启动之前被缓存

默认情况下,jar和nativelib资源将被急切地下载, i、 例如,它们被下载并在本地提供给运行 在应用程序启动之前,先启动应用程序。jar和nativelib 元素还允许将资源指定为惰性。这意味着 资源不必下载到客户端系统 在应用程序启动之前


中,我遇到了一个类似的问题,但是从文件加载.docx文档(XWPFDocument)时遇到了这个问题。在本地执行此操作时,加载文件的时间不到1秒;然而,通过JavaWebStart完成这项工作对我来说大约需要35秒,对我的同事来说甚至需要半个小时。下面是我如何解决它的,希望它也能解决这个问题

罪魁祸首是ApacheXMLBeans库,或者说它在ApachePOI中的使用方式不正确。ApachePOI发行版中包含的XMLBeans库是2.3.0版,jar文件是XMLBeans-2.3.0.jar。如果您在本地启动程序时将其包含在类路径中,它就可以正常工作。但是,如果您将它作为资源包含在.jnlp文件中,并使用WebStart启动程序,它的工作速度会非常慢,正如您所解释的。如果打开Java控制台并将跟踪级别设置为5,则在加载.docx文件时,程序将查找资源xbean.jar,即使在.jnlp文件中可能没有。这将导致程序查找资源直到超时,并且可能会重试多次,导致加载时间缓慢

有一个关于这方面的错误报告


我通过下载2.5.0版解决了这个问题,我没有包括xmlbeans-2.3.0.jar,而是在类路径中包括了xbean.jar和jsr173_1.0_api.jar,并将其作为.jnlp文件中的资源。

True,但没有解释webstart与本地时间的差异。我花了很多时间为这个应用配置POI库。不要问我为什么,但是
poiooxml模式
jar不起作用。整个事情让我很困惑,花了我很长时间才弄明白,但现在它起作用了。但是是的,这个小库不起作用。另外,
WorkbookFactory.create(新文件(inputFile.getText())
引发编译器错误,没有用于
WorkbookFactory.create(文件文件)
的方法。不知道为什么他们会在他们的文档中包含这些内容??这是我使用
FileInputStream
的唯一原因。听起来你使用的是古老版本的POI。升级到最新版本,很可能两者都能正常工作!隐马尔可夫模型。。。确实是POI 3.5,但那是因为我无法让3.9正常工作。圆木钉穿过了方孔,哈哈:)我的j2se标签上写的都是
。我认为我不需要手动调整堆大小。这是一个非常(非常)小、轻量级的应用程序。它只有一个帧。在比较两个环境时,设置之间是否存在差异?不,我没有向命令行添加任何参数或指定任何特定的内容。我在单元测试时开发并运行Netbeans,因此除非我不知道Netbeans
run
与命令行
javamyjar.jar
…使用
javaws
,否则启动
.jnlp
WorkbookFactory.create(new FileInputStream(new File(inputFile.getText())));
WorkbookFactory.create(new File(inputFile.getText()));
<resources>
        <jar download="eager" href="uploads/lib/guice-multibindings-3.0.jar"/>
</resources>