一、使用场景
数据库有两张表 t_person
和 t_school
如下:前端传来10000条person数据要插入到t_person
,同时要删除t_school
表中id为1的数据(为提高效率采用线程池做)
二、思路
1、要保证主线程和子线程使用的同一个sqlSession
2、手动控制提交和回滚
3、将10000条数据均分成10份,每份1000条,创建10个任务,放入线程池执行!
三、代码及注释如下:
1、核心业务代码
@Service
public class PersonServiceImpl extends ServiceImpl<PersonMapper, Person> implements IPersonService {
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
@Autowired
private SchoolMapper schoolMapper;
private ArrayBlockingQueue queue=new ArrayBlockingQueue(8,true);
private ThreadPoolExecutor.CallerRunsPolicy policy=new ThreadPoolExecutor.CallerRunsPolicy();
//1、创建核心线程为10的线程池
private ThreadPoolExecutor executor = new ThreadPoolExecutor(10,15,10, TimeUnit.SECONDS
,queue,policy);
@Override
public int insertPerson(Person person) {
return this.baseMapper.insert(person);
}
@Override
@Transactional
public void inserPersonBatch(List<Person> list) throws SQLException {
//2、根据sqlSessionTemplate获取SqlSession工厂
SqlSessionFactory sqlSessionFactory = sqlSessionTemplate.getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFa