java - 如何使用准备好的语句和批处理将大型csv导入到mysql中

标签 java mysql csv prepared-statement batch-processing

这里我有一个代码块,它将插入到名为 Earnings 的表中,并为 csv 的每一行使用 4 个整数的准备语句,并将它们添加到批处理中,并在读取所有行时执行该批处理。为什么这会从 csv 文件的第 2009 行开始插入,换句话说,它看起来不稳定,只会将 csv 的一部分导入到 mysql 表中,如何使 6530 行 csv 的批处理执行更高效?另外,我如何处理不存在的准备好的语句,比如说准备好的语句的参数索引 4 处可能存在 int 或者可能为空。

statement.executeUpdate("CREATE TABLE Earnings("
                    + "tournament INT references Tournaments( tournament_id ), "
                    + "player INT references Players( player_id ), "
                    + "prize_money INT, "
                    + "position INT, "
                    + "PRIMARY KEY(tournament, player))");
Statement statement = conn.createStatement();
try{
                String insertTableSQL2 = "INSERT INTO Earnings"
                        + "(tournament, player, prize_money, position) VALUES"
                        + "(?,?,?,?)";
                PreparedStatement preparedStatement2 = conn.prepareStatement(insertTableSQL2);
                BufferedReader reader2 = new BufferedReader(new FileReader("earnings.csv"));
                String line = null; //line read from csv
                Scanner scanner = null; //scanned line
                while ((line = reader2.readLine()) != null) {

                    scanner = new Scanner(line);
                    scanner.useDelimiter(",");

                        while (scanner.hasNext()) {
                            String str = scanner.next();
                            preparedStatement2.setInt(1, Integer.parseInt(str));
                            String str2 = scanner.next();
                            preparedStatement2.setInt(2, Integer.parseInt(str2));
                            String str3 = scanner.next();
                            preparedStatement2.setInt(3, Integer.parseInt(str3));
                            String str4 = scanner.next();
                            preparedStatement2.setInt(4, Integer.parseInt(str4));
                            preparedStatement2.addBatch();
                        }


                }
                preparedStatement2.executeBatch();
                preparedStatement2.close();
                scanner.close();
                reader2.close(); //closing CSV reader
            }
            catch(Exception e){
                e.printStackTrace();
            }
            System.out.println("earnings.csv imported");

csv 的格式如下:

19367,26,677,1
19367,112,271,2
19372,51,134,1
19382,213,150,1
19382,243,50,2
18446,34,2976,1
18446,111,1082,2
19452,28,135,1

最佳答案

使用 LOAD DATA INFILE 语法。如果使用它,速度会更快,也不需要编写所有这些代码行。

检查here

关于java - 如何使用准备好的语句和批处理将大型csv导入到mysql中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55233640/

相关文章:

Oracle 9 的 Java oci 数据库连接故障转移

java - 在对象的ArrayList中查找字符串 - java

java - 如何使用 SwingWorker 和/或 Timer?

mysql - 在两个值之间过滤 mysql 表中的数据

php - 更新时遇到问题

php - 如何选择具有最新日期时间的标题?

Python for 循环在迭代 CSV 行时不合理地中途停止

c# - 如何在 TPL 数据流中执行异步操作以获得最佳性能?

java - 其余异常: Wrappers vs Error Object

python - 在python中修改同一目录中的多个.csv文件