java - 多线程旧版Java应用程序的线程按顺序轮流

标签 java multithreading concurrency java-6

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

我正在尝试调试多年前不再存在的人编写的多线程旧版Java应用程序(JDK 1.6)。它正在尝试将一些数据插入Oracle DB。该应用程序通常在Weblogic 11G服务器上运行,大约需要5分钟才能完成运行计算。但是,在本地调试时,线程不能同时运行,它们轮流在我的本地计算机上。这使运行时间从前面提到的5分钟缩短到了大约1小时,并且仍然设法用完了堆(我给了它8GB),或者如果幸运的话,抛出NullPointerException,但这不是业务用户的错误。我一直在考虑将其缩减为仅使用一个线程,因为无论如何它都会轮流旋转,但是在触摸了一周之后,业务影响变得真实起来,我不能只用锤子敲打它。
考虑到我还没有提供代码,这可能是一个漫长的过程,但是有人有类似问题的经验吗?特别是为什么线程轮流使用。

编辑:用户的错误是违反约束,所以我认为它正在修改输入的数据,并做类似增加额外的精度。
问题:应用程序的10个线程按顺序运行,而不是并发运行,并且该代码潜在地包含内存泄漏,从而导致应用程序崩溃,并且没有遇到与业务用户遇到的约束冲突异常相同的代码。
编辑2:我怀疑这些线程需要权衡取舍,而不是同时运行,这可能导致它们不在我的本地计算机上运行垃圾回收吗?但是,如果我很幸运不会堆满,它仍然不能解释我收到与业务用户不同的错误的问题。

最佳答案

您的直觉很可能是正确的,这些直觉告诉您“线程”正在对您不利,而您的前任只是给您留下了一个他无法解决的不可行的设计。
在所有情况下,“最终接收者”都是[Oracle ...]数据库。无论应用程序如何向它提出请求,唯一重要的是它收到的请求。显然,客户端正在与自己发生冲突,因此很可能根本没有理由拥有多个线程。

关于java - 多线程旧版Java应用程序的线程按顺序轮流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65997645/

相关文章:

java - 在消费者线程收到同步更改通知并退出后,处理生产者线程的正确方法是什么?

java - 以编程方式打开请勿打扰,但有异常(exception)

c++ - 从 3 个线程访问 std::deque

c - pthreads 读取和写入同一个变量

java - 具有执行器框架的多个任务

concurrency - go例程中的执行顺序

java - 我的executeUpdate() 工作,但未提交

java - JOGL 是否支持 NURBS?

java - 保持 html、css、javascript 或任何 <between-these-brackets> 不变,其余部分转换为 ASCII 字符

java - Findbugs - 对 java.util.concurrent.ConcurrentHashMap 的调用序列可能不是原子的