多线程遗留 Java 应用程序的线程按顺序轮流

问题描述

TL;DR - 用户错误(ORA-01438:大于此列允许的指定精度的值)。我无法在本地重新创建它,因为当我的机器运行多线程应用程序时,一次只有十个线程中的一个按顺序运行。此外,即使为堆分配了 8GB,运行它也经常导致我的机器用完堆,然后我碰巧遇到了 NullPointerException 而不是用户的问题。


我正在尝试调试多年前由不再存在的人编写的多线程遗留 Java 应用程序 (JDK 1.6)。它正在尝试将一些数据插入到 Oracle 数据库中。该应用程序通常在 Weblogic 11G 服务器上运行,大约需要 5 分钟才能完成计算。但是,在本地调试时,线程不能同时工作,它们在我的本地机器上轮流运行。这使得运行时间从前面提到的 5 分钟缩短到大约 1 小时,并且仍然设法用完堆(我给了它 8GB)或者如果幸运的话抛出 NullPointerException,但这不是业务用户错误。我曾经考虑过将它减少到只使用一个线程,因为它无论如何都是轮流的,但是在接触了一个星期之后,业务影响变得真实,我不能一直用锤子敲它。

鉴于我还没有提供代码代码,这可能是一个长期的尝试,但是有没有人有过类似问题的经验?特别是线程轮流的原因。


编辑:用户错误是违反约束的,所以我认为它正在修改输入的数据并做一些诸如增加额外精度的事情。

问题:应用程序的 10 个线程按顺序运行,而不是并发运行,并且代码可能包含内存泄漏,导致应用程序崩溃并且未命中业务用户遇到的违反约束异常的相同代码

>

编辑 2:我怀疑线程权衡,而不是并发运行,可能导致它们不在我的本地机器上运行垃圾收集?尽管如此,如果我足够幸运没有用完堆,它仍然不能解释我收到与业务用户不同的错误的问题。

解决方法

您的直觉很可能是正确的,它告诉您“线程”正在对您不利,而您的前任只是给您留下了一个他永远无法修复的行不通的设计。

“最终接收者”在所有情况下都是“[Oracle ...] 数据库。”无论应用程序如何向它呈现请求,唯一重要的是它接收到的请求。显然,客户端正在与自己发生冲突,因此很可能根本没有理由拥有多个线程。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...