用同一个mapper开启多个线程分别插入不同的表
时间: 2024-03-22 11:40:16 浏览: 58
在 MyBatis 中,每个线程都可以创建一个 SqlSession 实例,并通过该实例执行数据库操作。因此,可以通过创建多个 SqlSession 实例,分别在不同的线程中执行数据库操作。
要在同一个 mapper 中开启多个线程分别插入不同的表,可以按照以下步骤进行:
1. 创建一个实现 Runnable 接口的插入任务类,该类包含一个 SqlSession 实例和对应的 mapper 方法。
```java
public class InsertTask implements Runnable {
private SqlSessionFactory sqlSessionFactory;
private String mapperMethod;
private Object parameter;
public InsertTask(SqlSessionFactory sqlSessionFactory, String mapperMethod, Object parameter) {
this.sqlSessionFactory = sqlSessionFactory;
this.mapperMethod = mapperMethod;
this.parameter = parameter;
}
@Override
public void run() {
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
sqlSession.getMapper(UserMapper.class).batchInsert(parameter);
sqlSession.commit();
} catch (Exception e) {
sqlSession.rollback();
e.printStackTrace();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
```
2. 在主线程中创建多个 SqlSession 实例,并将其传递给对应的插入任务类。
```java
public static void main(String[] args) {
SqlSessionFactory sqlSessionFactory = createSqlSessionFactory();
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
Object parameter = createInsertParameter(); // 创建插入参数
String mapperMethod = "batchInsert"; // 对应的 mapper 方法名
InsertTask insertTask = new InsertTask(sqlSessionFactory, mapperMethod, parameter);
executorService.submit(insertTask); // 提交任务到线程池
}
executorService.shutdown(); // 关闭线程池
}
```
在以上示例中,创建了一个包含 10 个线程的线程池,并将 10 个插入任务提交到线程池中执行。每个任务都包含一个 SqlSession 实例和对应的插入参数,可以在不同的线程中执行不同的插入操作。
需要注意的是,在多线程环境下,需要保证每个线程操作的是不同的 SqlSession 实例,否则会出现并发问题。同时,需要保证插入操作的参数和方法是正确的,否则会导致数据错误。
阅读全文