首页 > 解决方案 > 多线程遗留 Java 应用程序的线程按顺序轮流

问题描述

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


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

鉴于我没有提供代码和代码,这可能是一个长镜头,但有没有人有类似问题的经验?特别是为什么线程轮流。


编辑:用户的错误是违反约束的,所以我认为它正在修改输入的数据并执行诸如增加额外精度之类的操作。

问题:应用程序的 10 个线程是按顺序工作而不是同时工作,并且代码可能包含内存泄漏,导致应用程序崩溃并且没有遇到业务用户遇到的约束违反异常的相同代码。

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

标签: javamultithreadingconcurrencyjava-6

解决方案


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

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


推荐阅读