多线程事务
在Spring开发时,遇到一个从Excel表导入数据到数据库的需求,当然最简单的方法就是先使用EasyExcel把数据读出到集合中,然后依次插入到数据库中。
但如何保证效率,原子性呢?我们一步步优化方案。这里不会引入不必要的组件,而是自己模拟类似的思想。
方法1:依次顺序插入
void test() {
List<User> users = getAllUsers();
users.forEach(user -> userService.save(user));
}
复制代码
方法2:使用批处理,一次操作中执行多条SQL
void test() {
List<User> users = getAllUsers();
userService.saveBatch(users);
}
复制代码
方法3:使用多线程+批处理,每个线程插入多条数据
需要注意的一点,Spring容器不允许线程注入,也就是没办法在多线程直接使用Bean操作,例如:
void testThread() { // 下面两种方式是无效的,不会执行任何东西 Runnable runnable = () -> { userService.save(new User()); }; // 方法1 new Thread(runnable).start(); // 方法2 Executors.newFixed