我必须从CSV文件中读取记录并将它们存储在Mysql数据库中。
我知道" LOAD DATA INFILE"但在我的情况下,我必须从文件中获取单个记录,检查它是否有效格式/长度等,然后将其存储在数据库中。
// list to store records from CSV file
ArrayList<String> list = new ArrayList<String>();
//Read one line at a time
while ((nextLine = reader.readNext()) != null)
{
for (String number : nextLine)
{
if (number.length() > 12 && number.startsWith("88"))
{
list.add(number);
} else if (number.length() > 9 && number.startsWith("54"))
{
list.add(number);
}
else if (number.length() > 8 && number.startsWith("99"))
{
list.add(number);
}
else
{
// ....
}
// method to insert data in database
insertInToDatabase(list);
}
}
以及在db:taken from here
中插入记录的方法private void insertInToDatabase(ArrayList<String> list)
{
try
{
String query = "INSERT INTO mytable(numbers) VALUES(?)";
prepStm = conn.prepareStatement(query);
for (String test : list)
{
prepStm.setString(1, test);
prepStm.addBatch();// add to batch
prepStm.clearParameters();
}
prepStm.executeBatch();
}
}
这是有效的,但记录插入的速度非常慢。 有什么方法可以更快地插入记录。
答案 0 :(得分:1)
您需要使用:&#34; rewriteBatchedStatement
&#34;因为这是一个MYSQL 优化,它试图通过在尽可能少的数据包中合并插入或更新来减少到服务器的往返。
此外,该文章还有其他优化。希望这能加快批量生产。
编辑1: 此网站上对此参数也有清晰的解释:请参阅:MySQL and JDBC with rewriteBatchedStatements=true
答案 1 :(得分:0)
我认为更好的方法是使用定义的规则处理csv文件,然后创建另一个csv,并且一旦准备好输出csv。加载数据infile。
它会非常快。答案 2 :(得分:0)
如果要通过自己的应用程序插入,请创建此类批处理查询并执行到MySQL服务器。
String query = "INSERT INTO mytable(numbers)
VALUES (0),
(1),
(2),
(3)";
答案 3 :(得分:0)
@ Khanna111的答案很好。
我不知道它是否有帮助,但请尝试检查表引擎类型。我曾经遇到过记录插入速度很慢的问题。我将引擎从InnoDB更改为MyISAM,插入变得非常快。