使用jdbc:从tar.gz到mysql db的数据传输在大约20万个条目之后变得很慢

col17t5w  于 2021-06-17  发布在  Mysql
关注(0)|答案(0)|浏览(212)

在过去的几天里,我花了相当长的时间尝试将结构化(xml)数据从tar.gz(大小相当小的约145万个不同的文件)转换成更友好的格式到数据库中。
我不知道我可能会透露什么数据或用例,但我会尽我所能解释我的努力。
我有一个包含以下列类型的表(mysql;数据库):

int(11) PK NN UQ
varchar(150) NN
varchar(400) NN
text 
text NN
varchar(45) NN UQ
varchar(80) NN
date NN
text 
varchar(300) 
varchar(300) 
varchar(500) 
varchar(260) 
varchar(200) 
varchar(45)

遍历整个tar只需查看数据+解析大约需要90秒+/-:

try (TarArchiveInputStream tarArchiveInputStream =
                     new TarArchiveInputStream(
                             new BufferedInputStream(
                                     new GzipCompressorInputStream(
                                             new FileInputStream(tarLocation))))){

...
    while ((entry = tarArchiveInputStream.getNextTarEntry()) != null && processedTarEntries < maxNumber) {
    ...PARSING + SOME STATISTICS....
    }
}

我希望下面的代码能够充分了解我的迭代过程;如果没有,我将尝试提供更多(本例中使用totalcount生成人工id)。准备好的语句是“普通”insert-into语句。

setPreparedStatementValues(preparedStatement, record, totalCount[0]++);

preparedStatement.addBatch();

counter[0]++;

if (counter[0] == BATCH_SIZE){
    counter[0] = 0;
    preparedStatement.executeBatch();
    connection.commit();
    watch.stop();
    System.out.println("Elapsed time for batch " + (totalCount[0] / BATCH_SIZE) + ": " + watch.getTime());
    watch.reset();
    watch.start();
}

sout输出的相关部分如下所示(batchsize 5k/10k实际上没有什么区别):

Elapsed time for batch 29: 3430
Elapsed time for batch 30: 3400
Elapsed time for batch 31: 3553
Elapsed time for batch 32: 3405
Elapsed time for batch 33: 3509
Elapsed time for batch 34: 3544
Elapsed time for batch 35: 6124
Elapsed time for batch 36: 5273
Elapsed time for batch 37: 9171
Elapsed time for batch 38: 8922
Elapsed time for batch 39: 24878
Elapsed time for batch 40: 68124
Elapsed time for batch 41: 70886
Elapsed time for batch 42: 78856
Elapsed time for batch 43: 80879
Elapsed time for batch 44: 85223
Elapsed time for batch 45: 92639
Elapsed time for batch 46: 80106

时间似乎是线性的,直到第40批之前的某个地方,然后爆炸。这个输出来自一个最大300k条目的实验,但是我尝试将它分成两个独立的运行,每个运行150k条。输出非常类似于尝试一次性完成全部300k。
我将非常感谢的建议,我可能会做什么错,如果我是或建议如何加快这一点!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题