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