java - 如何使用多线程将List中的数据插入到DB表中以提高性能?

标签 java multithreading

我必须将员工数据从文本文件(每条记录用制表符分隔)读入 ArrayList。然后我必须将这个员工对象从列表插入到数据库中的员工表。为此,我逐一迭代列表元素,并一次将一个员工详细信息插入数据库。出于性能考虑,不推荐使用这种方法,因为我们可以拥有超过 100k 条记录,并且插入整个数据将花费很多时间。

我们如何在将数据从列表插入数据库时​​使用多线程来提高性能。还有我们如何使用 CountDownLatch 和 ExecutorService 类来优化这个场景。

读写测试

public class ReadWriteTest {

public static void main(String... args) {
    BufferedReader br = null;
    String filePath = "C:\\Documents\\EmployeeData.txt";
    try {
        String sCurrentLine;
        br = new BufferedReader(new FileReader(filePath));
        List<Employee> empList = new ArrayList<Employee>();

        while ((sCurrentLine = br.readLine()) != null) {
            String[] record = sCurrentLine.split("\t");
            Employee emp = new Employee();
            emp.setId(record[0].trim());
            emp.setName(record[1].trim());
            emp.setAge(record[2].trim());
            empList.add(emp);
        }
        System.out.println(empList);

        writeData(empList);

    } catch (IOException | SQLException e) {
        e.printStackTrace();
    }
}

public static void writeData(List<Employee> empList) throws SQLException {
    Connection con =null;
    try{  
        Class.forName("oracle.jdbc.driver.OracleDriver");  

        con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","system","oracle");  
        for(Employee emp : empList)  
        {
        PreparedStatement stmt=con.prepareStatement("insert into Employee values(?,?,?)");  
        stmt.setString(1,emp.getId()); 
        stmt.setString(2,emp.getName());
        stmt.setString(3,emp.getAge());
        stmt.executeUpdate();   
        }         
        }catch(Exception e){ 
            System.out.println(e);
        }
        finally{
            con.close();
        }   
        }  
}

员工类

public class Employee {

String id;
String name;
String age;

public String getId() {
    return id;
}
public void setId(String id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getAge() {
    return age;
}
public void setAge(String age) {
    this.age = age;
}
@Override
public String toString() {
    return "Employee [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}

EmployeeData.txt

1   Sachin  20
2   Sunil   30
3   Saurav  25

最佳答案

直接导入

Java 应用程序方法的替代方法是数据库方法。所有主要数据库都有可以将数据直接从文本文件导入表的工具。

PostgresCOPY命令。这可以是 run from the command line或从 SQL 中。参见 the wiki page供讨论。

查看您的数据库工具集。

关于java - 如何使用多线程将List中的数据插入到DB表中以提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36607104/

相关文章:

java - 将 JTextField 替换为 Java Swing 中的一行

node.js - Electron:在另一个线程中执行 sqlite (better-sqlite) db 操作

java - 优雅地停止正在运行的java程序

multithreading - 从哪里开始认真的并发(多线程、并行?)编程

multithreading - 更好地解释 TAS Vs。 "The Art Of Multiprocessor Programming"Herlihy & Shavits 上下文中的 TTAS

java - Settings.xml 不会让我改变背景颜色?

java - 创建 PKCS#10 CSR 和 HMAC 印章

java - 带有 OnTouchListener 的按钮,在 Android Studio 中按住时持续执行某些操作

Java MySQL和JFrame连接 "Cannot convert from boolean to connection"

android - Android上的TimerTask是如何管理线程的?