Java 多个线程什么都不等待?

Java 多个线程什么都不等待?,java,multithreading,spring,hibernate,spring-batch,Java,Multithreading,Spring,Hibernate,Spring Batch,TLDR:在多线程大规模数据库插入过程中,多个线程在等待,没有明显的原因 我们需要在数据库中创建多行。为了加快插入速度,我们使用多线程,以便可以并行地生成和插入多个对象。我们正在使用Hibernate、Spring批处理和Spring调度(ThreadPoolTaskExecutor、Partitioner、ItemProcessor)。我们从一开始 我们使用JVisualVM查看线程状态,并注意到无论运行程序的硬件是什么,一次活动线程都不会超过8个。我们尝试了“标准桌面”计算机(双核),但也尝

TLDR:在多线程大规模数据库插入过程中,多个线程在等待,没有明显的原因

我们需要在数据库中创建多行。为了加快插入速度,我们使用多线程,以便可以并行地生成和插入多个对象。我们正在使用Hibernate、Spring批处理和Spring调度(ThreadPoolTaskExecutor、Partitioner、ItemProcessor)。我们从一开始

我们使用JVisualVM查看线程状态,并注意到无论运行程序的硬件是什么,一次活动线程都不会超过8个。我们尝试了“标准桌面”计算机(双核),但也尝试了两台AIX:一台有8个活动CPU,一台有60个活动CPU

知道为什么一次不能有超过8个工作线程吗

我们已经检查过的事项列表:

  • 所有线程都有一项工作要做(Partitioner和ThreadPoolTaskExecutor的配置使每个线程都有相同数量的数据要插入数据库)
  • 我们尝试了各种提交间隔:1,P,其中P是分区的大小,N,其中N是所有P的总和(这不应该是问题的原因,但提交数据似乎是作业中很长的一部分,而数据生成很快)
  • 8不是我们使用的任何对象参数的默认值

您使用什么来访问数据库?并发数据库连接的数量有限制吗?我们使用Hibernate。我会检查连接的数量,好主意。但是,对连接数量的限制不应导致在前8个线程完成后启动N-8线程。对我来说,所有线程都应该一起启动,我们应该看到争用/锁定(在jvisualvm上显示为红色)@Martin,我不知道Hibernate,但是如果我提供了一个库,允许最多8个线程一次调用,并且您尝试从10个线程调用它,您将不会看到两个额外的线程被互斥锁阻塞。您会看到它们在一个Semaphore.acquire()调用中等待。您要在多少个表中插入/更新它们?他们在这个过程中被锁定了吗?也许你有八个线程与锁连接。所以是的,有一个限制的db连接的数量。。。8 :). 将BasicDatasourcebean的属性initialSize和maxActive配置为等于线程数的值,让所有线程一起工作(不要浪费时间通过hibernate进行设置,它不起作用)!然而,我遇到了一个新问题:HibernateID生成器上存在大量线程争用。我会调查并告诉你们原因:)谢谢你们的建议