Java jdbc批量多线程读取CSV文件并入库,可以分为以下步骤:
-
读取CSV文件:使用开源库OpenCSV或者Apache Commons CSV都可以实现。读取CSV文件时可以使用多线程处理提高效率,可以通过将文件划分为多个小文件,使用多个线程并发读取来实现。
-
数据库连接:使用JDBC连接数据库,并获取数据库连接对象Connection。可以使用数据库连接池来优化性能,比如使用HikariCP等开源库。
-
数据库操作:使用JDBC对数据库进行操作,可以使用PreparedStatement对象来进行批量插入操作。在多线程操作时需要注意Connection和PreparedStatement对象的线程安全,可以通过使用ThreadLocal变量来实现线程隔离。
以下是示例代码,假设CSV文件中每行数据包含两个字段,分别是id和name。数据库中有一个表user(id, name)。
使用OpenCSV读取CSV文件并入库:
import com.opencsv.CSVReader;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
public class CsvToDb {
public static void main(String[] args) throws Exception {
String csvFilePath = "users.csv";
String sql = "INSERT INTO user(id, name) VALUES(?, ?)";
Connection conn = getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
try (CSVReader reader = new CSVReader(new FileReader(csvFilePath))) {
String[] nextLine;
while ((nextLine = reader.readNext()) != null) {
int id = Integer.parseInt(nextLine[0]);
String name = nextLine[1];
ps.setInt(1, id);
ps.setString(2, name);
ps.addBatch();
}
ps.executeBatch();
}
closeConnection(conn);
}
private static Connection getConnection() {
// TODO: 获取数据库连接
return null;
}
private static void closeConnection(Connection conn) {
// TODO: 关闭数据库连接
}
}
使用多线程读取CSV文件并入库:
import com.opencsv.CSVReader;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CsvToDbMultiThread {
private static final int THREAD_NUM = 5;
public static void main(String[] args) throws Exception {
String csvFilePath = "users.csv";
String sql = "INSERT INTO user(id, name) VALUES(?, ?)";
Connection conn = getConnection();
ExecutorService executorService = Executors.newFixedThreadPool(THREAD_NUM);
for (int i = 0; i < THREAD_NUM; i++) {
executorService.execute(() -> {
try {
PreparedStatement ps = conn.prepareStatement(sql);
try (CSVReader reader = new CSVReader(new FileReader(csvFilePath))) {
String[] nextLine;
while ((nextLine = reader.readNext()) != null) {
int id = Integer.parseInt(nextLine[0]);
String name = nextLine[1];
ps.setInt(1, id);
ps.setString(2, name);
ps.addBatch();
}
ps.executeBatch();
}
} catch (Exception e) {
e.printStackTrace();
}
});
}
executorService.shutdown();
while (!executorService.isTerminated()) {}
closeConnection(conn);
}
private static Connection getConnection() {
// TODO: 获取数据库连接
return null;
}
private static void closeConnection(Connection conn) {
// TODO: 关闭数据库连接
}
}
在使用这两个示例代码时,需要根据实际情况替换TODO注释中的代码,比如获取数据库连接和关闭数据库连接的代码。同时需要根据实际的CSV文件和数据库表结构来修改代码中的相关参数和SQL语句。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java jdbc批量多线程读取CVS文件入库 - Python技术站