多线程处理导入两百万数
时间: 2023-07-07 18:38:50 浏览: 167
使用多线程可以加快导入数据的速度,提高效率。以下是一个使用多线程导入两百万数据的示例代码:
```java
public void insertData(List<Data> dataList) throws InterruptedException {
int numThreads = 10; // 线程数量
int batchSize = 1000; // 每批插入的数据量
int count = 0;
ExecutorService executor = Executors.newFixedThreadPool(numThreads);
try {
List<List<Data>> batches = splitIntoBatches(dataList, batchSize);
CountDownLatch latch = new CountDownLatch(batches.size());
for (List<Data> batch : batches) {
executor.submit(() -> {
try {
insertBatch(batch);
} catch (SQLException e) {
e.printStackTrace();
} finally {
latch.countDown();
}
});
}
latch.await();
} finally {
executor.shutdown();
}
}
private void insertBatch(List<Data> dataList) throws SQLException {
Connection conn = null;
PreparedStatement pst = null;
try {
conn = getConnection(); // 获取数据库连接
pst = conn.prepareStatement("INSERT INTO my_table (col1, col2, col3) VALUES (?, ?, ?)");
for (Data data : dataList) {
pst.setString(1, data.getCol1());
pst.setInt(2, data.getCol2());
pst.setDouble(3, data.getCol3());
pst.addBatch();
}
pst.executeBatch();
} finally {
if (pst != null) {
pst.close();
}
if (conn != null) {
conn.close();
}
}
}
private <T> List<List<T>> splitIntoBatches(List<T> list, int batchSize) {
List<List<T>> batches = new ArrayList<>();
for (int i = 0; i < list.size(); i += batchSize) {
batches.add(list.subList(i, Math.min(i + batchSize, list.size())));
}
return batches;
}
```
这段代码将数据列表按批次分割,并使用线程池执行批处理操作。在每个线程中,使用 `insertBatch()` 方法将一个批次的数据插入到数据库中。使用 `CountDownLatch` 等待所有线程完成任务。可以根据实际情况调整线程数量和批处理数量大小,以达到最优的导入效率。需要注意的是,多线程导入数据时需要考虑线程安全问题,比如使用线程池和线程安全的数据库连接池。
阅读全文