数据库批量插入应该使用jdbc而非mybatis

尽管mybatisBatchExecutor,但还是比jdbc executeBatch慢多了。

/**
 * 批量插入用jdbc更快
 */
@SpringBootTest
public class BatchInsertTest {
    @Autowired
    private DataSource dataSource;
    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    /**
     * 测试mybatis(BatchExecutor)插入1万条数据的时间 => 22s
     */
    @Test
    public void test_batchInsert_mybatis() {
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
        UserMapper2 userMapper2 = sqlSession.getMapper(UserMapper2.class);
        try {
            long start = System.currentTimeMillis();
            int lastId = userMapper2.getLastId();
            for (int i = 0; i < 10000; ++i) {
                userMapper2.insert(new User(lastId + i + 1, "mybatis", "mybatis", null));
            }
            sqlSession.commit();
            long end = System.currentTimeMillis();
            System.out.format("%d s\n", (end - start) / 1000);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            System.out.println("回滚");
            sqlSession.rollback();
        } finally {
            sqlSession.close();
        }
    }

    /**
     * 测试jdbc插入1万条数据的时间 => 3s
     */
    @Test
    public void test_batchInsert_jdbc() throws SQLException {
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.SIMPLE);
        UserMapper2 userMapper2 = sqlSession.getMapper(UserMapper2.class);
        int lastId = userMapper2.getLastId();

        Connection connection = dataSource.getConnection();
        connection.setAutoCommit(false);
        String sql = "INSERT INTO user (id,username,password,did) VALUES(?,?,?,?)";
        PreparedStatement statement = connection.prepareStatement(sql);
        for (int i = 0; i < 10000; ++i) {
            statement.setLong(1, lastId + i + 1);
            statement.setString(2, "jdbc");
            statement.setString(3, "jdbc");
            statement.setString(4, null);
            statement.addBatch();
        }
        long start = System.currentTimeMillis();
        statement.executeBatch();
        connection.commit();
        long end = System.currentTimeMillis();
        System.out.format("%d s\n", (end - start) / 1000);
        
        statement.close();
        connection.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值