我有一个带有500K
条记录的.csv文件,其中每条记录都有4
列。我希望将所有这些记录导入Java(JDBC)中的SQLite表。
我尝试过使用executeUpdate()
和executeBatch()
,但这两个都非常慢。他们每分钟处理400-500
条记录。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.sql.*;
public class MyClass{
public static void main(String[] args) throws FileNotFoundException, ParseException, SQLException, ClassNotFoundException{
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:mydb.db");
stmt = c.createStatement();
String drop_sql = "DROP TABLE IF EXISTS MyTable";
stmt.executeUpdate(drop_sql);
String create_sql = "CREATE TABLE MyTable " +
"(VAR1 CHAR(50) NOT NULL, " +
"VAR2 CHAR(10) PRIMARY KEY NOT NULL," +
" VAR3 TEXT NOT NULL, " +
" VAR4 TEXT NOT NULL )";
stmt.executeUpdate(create_sql);
File premFile = new File("MyFile.csv");
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Scanner scanner = new Scanner(premFile);
scanner.useDelimiter(",");
int i = 0, count = 500000;
while (i < count){
String myRecord = scanner.nextLine();
String[] cols = myRecord.split(",");
String var1 = cols[0];
String var2 = cols[1];
Date var3 = df.parse(cols[2]);
Date var4 = df.parse(cols[3]);
String query = "INSERT INTO MyTable VALUES (" +
"'" + var1 + "', " +
"'" + var2 + "', " +
"'" + var3 + "', " +
"'" + var4 + "')";
stmt.addBatch(query);
i++;
}
stmt.executeBatch();
stmt.close();
c.close();
} catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
}
}
如果我采用SQLite方式,并使用.import my_file.csv my_table
将csv导入表中,我会在几秒钟内完成完整任务。有没有办法通过仅使用Java代码来实现类似的性能?
我尝试了PreparedStatement
,但没有明显的改进。
答案 0 :(得分:1)
我认为你最大的问题可能是你在每次迭代时回到文件中,我会尝试将这些行加载到数组中并从那里进行处理。
P.S。您可能不想在使用scanner.useDelimiter(",")
时使用scanner.nextLine()
,而不是scanner.next()
。我相信这没有任何作用,虽然我这样说可能不正确,试一试。