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

标签 java spring multithreading spring-batch

我是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/

相关文章:

c# - 如何在 .NET 中编写写时复制列表

java - (Java) Switch 找不到符号

java - 在Java中表示通用字符

Spring Roo Jpa 设置失败,maven-eclipse-plugin 问题?

java - 无法保存实体可嵌入 ID

java - ExecutorService.invokeAll 与 Future.get 每个结果的区别

java - 递归解析XML文件jdom

java - Spring Data JPA 如何为实现公共(public)接口(interface)的两个域类创建单个存储库?

java - Spring MVC - 多部分表单数据

c# - 如何在迭代中暂停循环