我遇到了
@Async
方法注释的某种线程问题。正在处理从 csv 到 DB 的数据,对于每 10000 条记录,将这些记录传递给另一个用 @Async
注释的方法。调用 @Async
方法后,立即清除 main 方法中的列表,也清除 @Async
中的列表。请帮忙解决这个问题。
一个类中的主要方法
@Async("threadPoolTaskExecutor")
@Override
public CommonResponse generateDedupInputFile(String inputRequest){
if (stagingData.size() == 10000) {
futures.add(databaseUpdateChanges.addInputDataStagingV12("tbl_staging", fieldQuery,
config.getInputFields(), batchId, stagingData));
logger.info("staging size: {}", stagingData.size());
stagingData.clear();
}
}
数据库类
@Async("threadPoolTaskExecutor")
@Transactional
public Future<String> addInputDataStagingV12(String tableName, String fieldQuery, List<InputField> inputFields,
BigInteger batchId, List<StagingDataModel> stagingDataModels) {
logger.info("Size : {}", stagingDataModels.size()); //Get data size as Zero
/** Data insert query**/
}
调用
stagingData.clear();
后,它也清除了addInputDataStagingV12
方法中的数据,因此无法插入数据。如果我删除 @Async("threadPoolTaskExecutor")
工作正常。
stagingData
看起来是类中的局部变量,因此任何人都可以随时更新它。最好复制列表并将其作为参数传递给函数。
这样的事情应该可以解决问题。
List<StagingDataModel> newStagingData = new Arraylist<>(stagingData);
futures.add(databaseUpdateChanges.addInputDataStagingV12("tbl_staging", fieldQuery,
config.getInputFields(), batchId, newStagingData));