gpt4 book ai didi

java - 使用 CountDownLatch 和 ExecutorService 类在数据库中插入 100K 条记录

转载 作者:行者123 更新时间:2023-11-30 07:27:28 24 4
gpt4 key购买 nike

我必须从具有超过 100K 记录的 ArrayList 向数据库中插入一些值。我使用 CountDownLatch 和 ExecutorService 类(如下所示)一次运行 10 个线程,以提高插入时的性能。我正在调用一个存储过程,在对详细信息进行一些处理后将员工详细信息插入到两个不同的表中。这是满足我的要求的正确方法吗?

 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");

final CountDownLatch latch = new CountDownLatch(empList.size());
ExecutorService taskExecutor = Executors.newFixedThreadPool(10);

final CallableStatement cstmt = con.prepareCall("{Call Prc_Insert_Employee(?,?,?)}");

for (int i = 0; i < empList.size(); i++) {
final Employee emp = empList.get(i);

Thread worker = new Thread() {
public void run() {
try {
cstmt.setString(1, emp.getId());
cstmt.setString(2, emp.getName());
cstmt.setString(2, emp.getAge());
cstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
finally{
latch.countDown();
}
}
};
taskExecutor.execute(worker);
}
taskExecutor.shutdown();
latch.await();
} catch (Exception e) {
System.out.println(e);
} finally {
con.close();
}
}

最佳答案

以下是我对您的代码的所有评论:

  1. 您应该考虑使用 addBatch() 而不是 executeUpdate() 来减少数据库和应用程序之间的往返总次数,它应该已经有很大帮助就性能而言,尤其是对于远程数据库,也许您甚至不需要使用这种方法来使用多个线程。
  2. 我不认为共享您的 CallableStatement 是一个好的做法。我不认为它是线程安全的,您应该为每个线程使用专用的 ConnectionCallableStatement
  3. 您需要调用connection.setAutoCommit(false)来禁用自动提交模式,该模式不适合用于加载大量数据。这意味着您需要对每 x 条存储的记录显式调用 connection.commit()
  4. 在您的代码中,您应该使用 Runnable 而不是 Thread,因为它是 ExecutorService 所期望的。不需要在此处创建 Thread 实例,因为 ExecutorService 会将其视为 Runnable,这样即使您提供超过 10 个 Runnable,您也只会有 10 个线程 对象传递给 ExecutorService执行
  5. 不需要 CountDownLatch,因为它已经被 shutdown() 方法覆盖,正如 javadoc 中提到的:

Initiates an orderly shutdown in which previously submitted tasks are executed, but no new tasks will be accepted.

关于java - 使用 CountDownLatch 和 ExecutorService 类在数据库中插入 100K 条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36630474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com