gpt4 book ai didi

Java多线程向数据库插入百万条记录

转载 作者:行者123 更新时间:2023-12-02 03:43:18 26 4
gpt4 key购买 nike

我是java新手,也是多线程新手。面试官一次又一次地问我一个问题。“给定一个 csv 文件 - 如果您要求用 java 读取一个包含数百万条记录的文件,并在更短的时间内将这些记录插入数据库。”面试官进一步问我——如何利用“多线程、批处理、Spring”等概念来解决上述问题?

我在互联网上得到了以下代码,但这看起来不太好,除了“PreparedStatement”之外,您还有其他选择吗?即使我在下面的代码中也看不到多线程的使用。

    BufferedReader in = new BufferedReader(new FileReader(file));
java.util.List<String[]> allLines = new ArrayList<String[]>(); // used for something else

String sql = "insert into test (a, b, c, d)” +
" values (?,?,?,?)";

PreparedStatement pstmt = conn.prepareStatement(sql);
int i=0;
while ((line = in.readLine()) != null) {

line = line.trim().replaceAll(" +", " ");
String[] sp = line.split(" ");
String msg = line.substring(line.indexOf(sp[5]));
allLines.add(new String[]{sp[0] + " " + sp[1], sp[4], sp[5], msg});

pstmt.setString(1, sp[0] + " " + sp[1]);
pstmt.setString(2, sp[4]);
pstmt.setString(3, sp[5]);
pstmt.setString(4, msg);

pstmt.addBatch();

i++;

if (i % 1000 == 0){
pstmt.executeBatch();
conn.commit();
}
}

pstmt.executeBatch();

最佳答案

不是真正的答案,但给你一些指导:

请注意,sql-server 可以接收的最大包大小有一个可配置的限制

  • 询问 csv 文件的属性是什么
    您是否可以假设每个条目代表唯一的内容,而不是代表同一数据库条目的多行

  • 检查该表的主键是什么

如果给出了唯一性,您可以并行导入(拆分文件)。可能必须关闭主键,这样数据库就不会锁定插入命令。

如果未给出唯一性,您可能需要预处理文件以使条目唯一。

  • 考虑批量大小:嗯,我不是数据库专家,但我学到的知识既不太大也不太小。

  • 不确定您所指的spring:也许是 Spring 框架?

关于Java多线程向数据库插入百万条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56823067/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com