Java Fork连接池卡住了
我有一个数据迁移服务,它从一个数据库中分块读取数据,然后将其迁移到另一个数据库中 为了处理数据块,我尝试使用递归操作和fork-join池。这样做的原因是我想并行地执行这些“块”上的工作,然后获得另一个块,然后执行,然后获得另一个块,等等 现在发生的是我的过程停止了。我在日志中没有看到异常,也没有看到死锁线程。我的代码如下,我的问题是:Java Fork连接池卡住了,java,multithreading,concurrency,Java,Multithreading,Concurrency,我有一个数据迁移服务,它从一个数据库中分块读取数据,然后将其迁移到另一个数据库中 为了处理数据块,我尝试使用递归操作和fork-join池。这样做的原因是我想并行地执行这些“块”上的工作,然后获得另一个块,然后执行,然后获得另一个块,等等 现在发生的是我的过程停止了。我在日志中没有看到异常,也没有看到死锁线程。我的代码如下,我的问题是: 我是不是在我的员工身上遗漏了什么?我是否需要返回一些值或调用一些方法来释放资源 我在这里使用递归动作真的很愚蠢吗?我应该使用不同的东西来并行化大量的工作吗 我
- 我是不是在我的员工身上遗漏了什么?我是否需要返回一些值或调用一些方法来释放资源
- 我在这里使用递归动作真的很愚蠢吗?我应该使用不同的东西来并行化大量的工作吗
- 我的线程转储中有一个工作线程似乎正在等待-这是正常的还是我的问题的某种指示
@组件
公共类BulkMigrationService{
最终ForkJoinPool池=新的ForkJoinPool();
私有静态最终记录器log=LoggerFactory.getLogger(BulkMigrationService.class);
私有源数据api;
专用最终迁移器迁移器;
私有元数据服务元数据服务;
@自动连线
public BulkMigrationService(SourceDataApi、Migrator Migrator、MetadataService MetadataService){
this.api=api;
this.migrator=migrator;
this.metadataService=metadataService;
}
public void migrate(整数batchSize,最大长度)抛出MigrationException{
长电流计数=0l;
整数currentIndex=0;
同时(当前计数<最大值){
List itemsToMigrate=api.findItemRange(currentIndex,currentIndex+batchSize);
如果(assetsToMigrate.size()>0){
MigrateForkedWorker starter=新的MigrateForkedWorker(AssetToMigrate);
pool.invoke(启动程序);
}
currentCount+=AssetToMigrate.size();
currentIndex+=batchSize-1;
if(log.isDebugEnabled()){
调试(“迁移的”+currentCount+“项”);
}
}
}
公共类MigrateForkedWorker扩展了RecursiveAction{
私人int最大值=10;
私人名单所有项目;
公共迁移MarkedWorker(列出所有项){
this.allItems=allItems;
}
@凌驾
受保护的void compute(){
如果(allItems.size()您的第一个问题是您正在使用invokeAll()。它只是向池提交新请求并等待它们完成。请遵循JavaDoc中的示例:use fork()
migrateForkedWorkerOne.fork();
migrateForkedWorkerWO.compute();
migrateForkedWorkerOne.join();我想知道我是否看到了这样的情况:我可能只是不太了解这些东西,无法使用它。最近在互联网上阅读:一位开发人员遇到了一个问题,尽管“我知道,我将使用线程”。现在他有10个问题
@Component
public class BulkMigrationService {
final ForkJoinPool pool = new ForkJoinPool();
private static final Logger log = LoggerFactory.getLogger(BulkMigrationService.class);
private SourceDataApi api;
private final Migrator migrator;
private MetadataService metadataService;
@Autowired
public BulkMigrationService(SourceDataApi api, Migrator migrator, MetadataService metadataService) {
this.api = api;
this.migrator = migrator;
this.metadataService = metadataService;
}
public void migrate(Integer batchSize, Long max) throws MigrationException {
Long currentCount = 0l;
Integer currentIndex = 0;
while (currentCount < max) {
List<String> itemsToMigrate = api.findItemRange(currentIndex, currentIndex + batchSize);
if (assetsToMigrate.size() > 0) {
MigrateForkedWorker starter = new MigrateForkedWorker(assetsToMigrate);
pool.invoke(starter);
}
currentCount += assetsToMigrate.size();
currentIndex += batchSize - 1;
if (log.isDebugEnabled()) {
log.debug("Migrated " + currentCount + " Items.");
}
}
}
public class MigrateForkedWorker extends RecursiveAction {
private int max = 10;
private List<String> allItems;
public MigrateForkedWorker(List<String> allItems) {
this.allItems = allItems;
}
@Override
protected void compute() {
if (allItems.size() <= max) {
for (String itemInfo : allItems) {
try {
migrator.migrateAsset(itemInfo);
}
catch (MigrationException e) {
e.printStackTrace();
}
}
}
else {
int targetSize = allItems.size() % 2 == 0 ? allItems.size() / 2 : (allItems.size() + 1) / 2;
List<List<String>> splits = Lists.partition(allItems, targetSize);
MigrateForkedWorker migrateForkedWorkerOne = new MigrateForkedWorker(splits.get(0));
MigrateForkedWorker migrateForkedWorkerTwo = new MigrateForkedWorker(splits.get(1));
invokeAll(migrateForkedWorkerOne, migrateForkedWorkerTwo);
}
}
}
}