jpa多线程存储20万数据到mysql具体代码
时间: 2024-09-23 22:04:41 浏览: 43
在JPA(Java Persistence API)中处理大量数据并行存储到MySQL数据库通常涉及到批量操作和事务管理。下面是一个简化的示例代码,展示如何在一个多线程环境中将20万条数据分批插入数据库:
```java
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// 假设有一个User实体类
@Entity
public class User {
private Long id;
private String name;
// getters and setters...
}
public class DataLoader {
@PersistenceContext
private EntityManager entityManager;
public void loadUsersToDatabase(List<User> users) {
ExecutorService executor = Executors.newFixedThreadPool(5); // 创建5个线程
int batchSize = 1000; // 每次插入1000条数据
for (int i = 0; i < users.size(); i += batchSize) {
List<User> batchUsers = users.subList(i, Math.min(i + batchSize, users.size()));
executor.submit(() -> insertBatch(batchUsers));
}
executor.shutdown();
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void insertBatch(List<User> users) {
if (!users.isEmpty()) {
try {
entityManager交易事务 {
for (User user : users) {
entityManager.persist(user);
}
entityManager.flush(); // 提交事务
}
} catch (Exception e) {
// 打印错误并回滚事务
System.out.println("Error inserting data: " + e.getMessage());
entityManager.getTransaction().rollback();
}
}
}
}
```
在这个例子中,`DataLoader`类负责管理和调度任务,而每个线程会调用`insertBatch()`方法将一批用户数据插入数据库。注意,为了保证并发安全,你需要确保在`insertBatch()`内部开启一个事务,并在异常发生时回滚。
阅读全文