Java Excel POI 在quartz 多次执行后停止

2023-11-27

我想对此有一些见解。

我有一个从数据库读取和写入 Excel 文件的程序。它的执行基于使用 Quartz api 的计时器,并在每周的每个星期二触发。问题是,当我通过安排它每小时执行一次作业来测试它时,程序在写入 Excel 文件的过程中执行几次后突然停止。这是我写入Excel的代码。

try {
        FileInputStream file = new FileInputStream(excelFile);
        POIFSFileSystem myFileSystem = new POIFSFileSystem(file);
        HSSFWorkbook workbook = new HSSFWorkbook(myFileSystem);
        HSSFSheet worksheet = workbook.getSheetAt(0);
        this.cellStyle00 = workbook.createCellStyle();
        HSSFDataFormat df = workbook.createDataFormat();
        this.cellStyle00.setDataFormat(df.getFormat("00"));

for(int i = 0;i<Access.size();i++){
         AccessorMethods SetGet = (AccessorMethods)
                    InstlibAccessor.get(i);

    HSSFRow row = worksheet.createRow(worksheet.getPhysicalNumberOfRows());
    HSSFCell cell = row.createCell(0);

    cell.setCellValue(new Double(SetGet.getOne()));
    cell.setCellStyle(cellStyle00);


  //other set value codes....

}
FileOutputStream fileOut = new FileOutputStream(fileName + ".xls");
workbook.write(fileOut);
 fileOut.flush();
 fileOut.close(); 

 //catch statements follow
 //end

命令行输出和netbeans输出不指示任何错误,例如内存不足等。程序不会结束..它只是停止..就像jvm正在无限循环上工作一样...为了提供更多信息关于这个主题,这是我的程序的简要流程。

  1. 用户执行调度程序
  2. 在所需的时间,调度程序执行程序(调度程序和“程序”是两个不同的程序/jar 文件。调度程序只是调用 jar)
  3. 程序首先创建 Excel 文件
  4. 然后读取数据库1。该数据库包含80K行
  5. 对于每一行,如果满足某个条件,则读取数据库 2 和 3
  6. 然后它将它一次存储在一个 arraylist 对象中(我试图避免任何内存问题,所以我批量存储它)
  7. 然后我分批编写,一次 1000 个以求出色(这是它停止的部分)
  8. 完成读写后,它会等待调度程序再次调用它...如果到达这一步,我就是一个快乐的程序员 =)

以下是我发现的一些观察结果;

  1. 程序通常在程序第 4 到 6 次执行时停止(即在调度程序不间断运行 4 或 6 小时后)
  2. 它停止在 Excel 中的随机写入点,例如第 34000 行、第 24 行或第 15 行等等等......
  3. 当我在没有调度程序的情况下执行程序时,不会发生此错误。我可以手动执行一整天(我做到了,这不是很有趣),没有任何错误。
  4. 输出 Excel 文件的大小显示为 0 字节
  5. 例如,如果我安排它每小时运行一次,但在这一小时它停止了。它仍将在接下来的几个小时内运行,但会停止,并且与前一次运行相比会在不同的点停止。

可能是什么原因导致了这个问题。也许是内存泄漏或更简单的原因?

附加信息

我通过导入其他程序的类并将其作为作业运行来实现 Quartz 调度程序。这是触发器的代码

JobDetail job = newJob(ExtractorSchedulerJobUtilTester.class)
            .withIdentity("job1", "group1")
            .build();

    CronTrigger trigger = newTrigger()
            .withIdentity("trigger1", "group1")
            .withSchedule(cronSchedule("0 0/2 * 1/1 * ? *"))
            .build();

    Date ft = sched.scheduleJob(job, trigger);
        sched.start();

和工作

public class ExtractorSchedulerJobUtilTester implements Job {
    public void execute(JobExecutionContext context)
        throws JobExecutionException {
    theProgram program= new theProgram();

    program.main();

    JobKey jobKey = context.getJobDetail().getKey();
    }
}

有没有可能;

  1. 该应用程序耗尽了我的内存并崩溃了
  2. 我在 Quartz 作业中仅使用“程序”的一个实例,该实例在作业第一次运行时初始化,并且该作业的所有后续执行都从该实例引用,从而最大化了内存。
  3. 它与数据库(AS400)相关(我怀疑,因为它在写入 Excel 时停止)。
  4. 计算机变得太累了,决定休息一下。

更新 - 12/28/2012

新年快乐伙计们/姑娘们!!

抱歉,我花了一些时间才回到这个话题..(当世界将在 21 号结束时,为什么还要在这上面浪费时间呢?当世界没有结束时,我感到苦乐参半)

我使用 netbeans profiler 分析了我的程序,并使用内存分析器得到了以下数据

memory dump

我在第一张图中注意到,我的程序每次迭代都会消耗大约 75MB 的堆大小(如粉色阴影所示)。这是否意味着程序每次迭代消耗的内存增加了 75mb?经过几次迭代后,将消耗大量内存,从而影响程序的执行。我目前正在尝试进行堆转储。一旦我设法让它运行,我就会立即发布它。

附加信息:我尝试使用仅运行 Quartz 的探查器(不触发任何内容),系统使用率相对较低,并且每次迭代的大小不会增加。

我终于设法得到了堆转储。我进行了两次转储,第一次是第一次迭代发生时,第二次是下一次迭代时。我注意到我的两个类的实例之间存在很大差异,如下所示

hash dump

Thanks!


经过大量的咒骂、祈祷和寻找之后,我想我已经找到了一个可能的解决方案。我所做的是添加System.gc();在我的 Quartz 工作课程结束时。因此,每次程序完成作业时都会调用垃圾收集。这只是一个可能的解决方案,而不是一个具体的答案,因为我仍然消耗了大量的堆内存(我相信在我的代码的混乱中仍然存在一些内存泄漏)。但是,随着System.gc();我的消费量大大减少了。我只是不确定这是怎么发生的。从逻辑上我认为GC只会影响内存分配而不影响程序的内存性能。见下图;上图是有 GC 的图,下图是没有 GC 的图。

enter image description here

正如您所看到的,使用 GC 的内存消耗比不使用 GC 的内存要少。我假设内存使用量仍然与 GC 相同,但是一旦调用 GC,使用的堆空间就会下降。我现在将使用这个解决方案,直到出现更好的答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Excel POI 在quartz 多次执行后停止 的相关文章

  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s

随机推荐

  • 如何绑定perl脚本中的每个变量?

    我想看到 perl 脚本中的变量被创建 访问 销毁时的每个地方 使用它可以轻松到达tie or Variable Magic 但是如何在创建变量时自动应用这个魔法呢 您可以查看 B Xref 它会生成应用程序中所有变量的交叉引用列表 基本上
  • 导航视图项目按下时不会响应

    我正在开发一个带有侧导航抽屉的应用程序 抽屉打开得很好 但是据说可以 点击 的文本似乎没有响应 动画显示 当轻敲抽屉时会有反馈 您可以听到声音 但没有任何结果 我尝试放置 toast 消息以查看按钮是否注册了操作 但按下时没有出现 toas
  • JPanel 动作监听器

    我有一个 JPanel 其中有一堆不同的复选框和文本字段 我有一个已禁用的按钮 需要在设置特定配置时启用 我需要的是在整个 JPanel 上寻找事件的监听器 每当发生任何变化时 我相信我需要一个动作侦听器 但我找不到任何东西来桥接动作侦听器
  • “导入错误:没有名为 pwd 的模块”,但它存在

    我正在尝试在本地测试 gae boilerplate 但是当我尝试创建新帐户时 会出现以下错误 奇怪的是 如果我打开 python 解释器并输入 import pwd 它就会起作用 Internal Server Error The ser
  • Objective C 中的悬空指针 - nil 也会释放内存吗?

    我的理解是 当内存未被释放或 释放 时 就会发生内存泄漏 当指针未设置为 nil 并且对象被释放时 就会出现悬空指针 我的问题是 可以将对象设置为 nil 释放内存并清除指针引用吗 i e Car myCar Car alloc initW
  • 需要重构箭头反模式的想法

    我继承了一个怪物 它伪装成 NET 1 1 应用程序处理符合医疗保健索赔支付 ANSI 835 标准的文本文件 但它是一个怪物 正在处理的信息涉及医疗保健索赔 EOB 和报销 这些文件由在前几个位置具有标识符的记录和根据该类型记录的规范格式
  • Go结构体和字节数组之间的转换

    我正在用 Go 编写一个客户端 服务器应用程序 我想在 Go 中执行类似 C 的类型转换 例如 在围棋中 type packet struct opcode uint16 data 1024 byte var pkt1 packet n r
  • 如何在视图内切换视图?

    我正在使用 MVVM 轻型框架制作一个 WPF 应用程序 我想做的是在视图中有一个登录表单 当用户按下该视图中的按钮时 它会为附加的 ViewModel 启动 LoginCommand 从那里我要么想要启动一个包含应用程序其余部分的新窗口
  • 没有可用的 mysql-server 软件包

    我正在尝试在 Amazon Linux 实例上设置 MySQL 我已经尝试了所有方法 也使用 y 选项 sudo yum install mysql server sudo yum install mysql56 server sudo y
  • 从类中删除必需的属性,但 MVC3 仍然不会在文本框中没有值的情况下发布表单

    我有课 在某一时刻 我使用 System ComponentModel 将类的属性设置为 Required 好吧 然后我意识到这是没有必要的 我已经删除了所需的属性 但是当我尝试将表单提交到 ActionResult 时 表单不会发布 并且
  • C# - 通过进程名称的一部分来终止进程

    我正在寻找如何在 C 中执行此操作 如下所示 foreach Process proc in Process GetProcessesByName cheatengine x86 64 proc Kill 我正在使用这个语句 但是该程序有不
  • 销毁并重新创建一个对象是否会使指向该对象的所有指针无效?

    这是后续这个问题 假设我有这样的代码 class Class public virtual method this gt Class new this Class Class object new Class object gt metho
  • 检测 Android JNI 代码中的本机内存泄漏

    如何检测Android JNI代码中的内存泄漏 我正在使用弗罗约 2017年更新 valgrind 可用对于安卓 内置的 malloc 调试功能在以下版本中得到了显着扩展 安卓N 对于查找内存泄漏非常有用 您可能需要 exit 应用程序触发
  • iPhone 的动态图标更改

    我的问题也和其他人之前问过的一样 我发现一旦你设置了应用程序的图标 我们就无法更改应用程序图标动态地 是的 我同意了 如果是这样 我们使用动态图标苹果不接受 但我承认苹果有一些规则和规定 所以这是我的问题 如何动态更改应用程序图标 我不会将
  • AppleScript:获取对象或类的所有属性的列表

    为了存储对象的值以供外部 外部 AS 访问 我需要能够获取该对象的每个属性 然后我尝试将其强制为文本并将其存储在某个地方 如何获取对象拥有的属性列表 作为一个例子 我可以这样写 tell me get properties end tell
  • 定义每个子类定义一次的静态属性的最佳方法是什么?

    我编写了以下控制台应用程序来测试静态属性 using System namespace StaticPropertyTest public abstract class BaseClass public static int MyPrope
  • Android 上的 Eclipse 调试出了什么问题? [复制]

    这个问题在这里已经有答案了 可能的重复 Android 看似无用的调试环境 我显然已经被 Visual Studio 宠坏了 因为虽然我刚刚学习 Android 和 Eclipse 环境 但在 Eclipse 中调试应用程序正在严重损害进一
  • 是什么导致我的函数最后返回 None ? [复制]

    这个问题在这里已经有答案了 我非常简单的 python 函数正在返回None最后 我不太清楚为什么 我看了一些其他的帖子 还是没明白 这是我的代码 def printmult n i 1 while i lt 10 print n i en
  • CSS图灵完备了吗?

    据我所知 CSS 不是图灵完备 但我对 CSS 的了解非常有限 CSS图灵完备了吗 你可以编码Rule 110在 CSS3 中 所以只要您考虑适当的随附 HTML 文件 它就是图灵完备的和用户交互成为CSS 执行 的一部分 A相当好的实施可
  • Java Excel POI 在quartz 多次执行后停止

    我想对此有一些见解 我有一个从数据库读取和写入 Excel 文件的程序 它的执行基于使用 Quartz api 的计时器 并在每周的每个星期二触发 问题是 当我通过安排它每小时执行一次作业来测试它时 程序在写入 Excel 文件的过程中执行