MybatisPlus批量保存原理及失效原因排查全过程

针对“MybatisPlus批量保存原理及失效原因排查全过程”的完整攻略,我将依次进行讲解。

1. Mybatis Plus 批量保存原理

Mybatis Plus 实现 Mybatis 的批量操作比起原始的 SqlSessionFactory,是原生支持批量插入、更新和删除的,而且你无需再考虑对数据层相关的代码进行批量包装处理。

具体的实现方式是,在执行批量操作时,Mybatis Plus 默认开启了 JDBC 的批量操作以及对事务进行了妥善的控制。而且,Mybatis Plus 内置了对批量插入、更新和删除进行优化的 Executor,进一步优化了批量操作的性能。

具体演示示例如下:

List<User> userList = new ArrayList<>();
User user1 = new User("Tom", 18, "USA");
User user2 = new User("Jerry", 20, "UK");
userList.add(user1);
userList.add(user2);
userRepository.saveBatch(userList); // Mybatis Plus 自带的批量插入方法

2. Mybatis Plus 批量保存失效排查全过程

但是,有的朋友在使用 Mybatis Plus 的批量保存时,可能会出现批量保存失败,只能逐条保存的情况。这是什么原因呢?下面我将按照如下的排查思路,带领大家一步一步地查找失效原因。

2.1 排查 SQL 执行异常

第一步,检查批量插入的 SQL 语句是否正确。尝试将批量插入的 SQL 语句打印出来,查看是否有语法错误,是否必要的参数缺失等等。

例如:

List<User> userList = new ArrayList<>();
User user1 = new User("Tom", 18, "USA");
User user2 = new User("Jerry", 20, "UK");
userList.add(user1);
userList.add(user2);
String sql = SqlHelper.getSqlInsert(userRepository.getSqlSession().getConfiguration(), "user");
System.out.println(sql); // 打印批量插入的完整 SQL 语句
userRepository.saveBatch(userList); // Mybatis Plus 自带的批量插入方法

2.2 排查事务限制

第二步,检查是否有事务限制。Mybatis Plus 内置的 Executor 要求必须在事务控制下才能使用批量操作。

例如:

@Autowired
private DataSource dataSource;

public void saveBatchDemo() {
    List<User> userList = new ArrayList<>();
    User user1 = new User("Tom", 18, "USA");
    User user2 = new User("Jerry", 20, "UK");
    userList.add(user1);
    userList.add(user2);
    try (SqlSession sqlSession = SqlHelper.sqlSessionBatch(dataSource)) {
        // 绑定 SqlSession
        userRepository.insertBatch(userList); // 批量插入
        sqlSession.commit(); // 提交事务
    } catch (Exception e) {
        e.printStackTrace();
    }
}

2.3 排查数据源驱动限制

第三步,检查数据源驱动是否限制了批量操作。有时,一些数据库驱动程序会对批量操作做出限制,例如最大批量数量等,这会影响到 Mybatis Plus 的批量插入、更新和删除操作。

例如:

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="maxActive" value="${jdbc.max.active}" />
    <property name="initialSize" value="${jdbc.initial.size}" />
    <property name="maxWait" value="${jdbc.max.wait}" />
    <property name="timeBetweenEvictionRunsMillis" value="${jdbc.time.between.eviction.runs}" />
    <property name="minEvictableIdleTimeMillis" value="${jdbc.min.evictable.idle.time}" />
    <property name="validationQuery" value="${jdbc.validation.query}" />
    <property name="testWhileIdle" value="${jdbc.test.while.idle}" />
    <property name="testOnBorrow" value="${jdbc.test.on.borrow}" />
    <property name="testOnReturn" value="${jdbc.test.on.return}" />
    <property name="poolPreparedStatements" value="${jdbc.pool.prepared.statements}" />
    <property name="maxPoolPreparedStatementPerConnectionSize" value="${jdbc.max.pool.prepared.statements.per.connection}" />
    <property name="filters" value="${jdbc.filters}" />
    <property name="connectionProperties" value="${jdbc.connection.properties}" />
</bean>

2.4 排查数据源设置

第四步,检查数据源设置是否合理。有时,数据源的配置也会影响到 Mybatis Plus 批量操作的执行效果。例如,数据源的连接数限制过于严格、缓存使用过多、等。

例如:

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="maxActive" value="${jdbc.max.active}" />
    <property name="initialSize" value="${jdbc.initial.size}" />
    <property name="maxWait" value="${jdbc.max.wait}" />
    <property name="timeBetweenEvictionRunsMillis" value="${jdbc.time.between.eviction.runs}" />
    <property name="minEvictableIdleTimeMillis" value="${jdbc.min.evictable.idle.time}" />
    <property name="validationQuery" value="${jdbc.validation.query}" />
    <property name="testWhileIdle" value="${jdbc.test.while.idle}" />
    <property name="testOnBorrow" value="true" />
    <property name="testOnReturn" value="false" />
    <property name="poolPreparedStatements" value="true" />
    <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
    <property name="filters" value="stat" />
    <property name="connectionProperties" value="druid.stat.slowSqlMillis=10000" />
</bean>

这就是 Mybatis Plus 批量保存原理及失效原因排查全过程的详细攻略。希望能对正在使用 Mybatis Plus 进行批量操作的朋友们有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MybatisPlus批量保存原理及失效原因排查全过程 - Python技术站

(1)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • centos6.4下mysql5.7.18安装配置方法图文教程

    CentOS 6.4下MySQL 5.7.18安装配置方法图文教程 简介 MySQL是现今最流行的关系型数据库管理系统之一,而CentOS是一个基于Linux的操作系统,本文将介绍在CentOS 6.4下安装MySQL 5.7.18的完整步骤。 步骤 1. 下载MySQL安装包 从MySQL官方网站下载MySQL 5.7.18的二进制安装包(tar.gz格式…

    database 2023年5月22日
    00
  • mysql命令行下执行sql文件的几种方法

    执行SQL文件是MySQL命令行下的常用操作之一。以下是三种常见的方法: 方法一:使用 Source 命令 语法: source file_name; 将SQL文件(file_name)的绝对路径或相对路径作为参数传递给source命令,MySQL将会直接执行该SQL文件中的命令。 示例: 假设SQL文件名为test.sql,并且文件路径为/root/tes…

    database 2023年5月22日
    00
  • MySQL聚合查询方法怎么使用

    本篇内容介绍了“MySQL聚合查询方法怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 1、前言 前面的内容已经把基础的增删改查介绍的差不多了,也介绍了表的相关约束, 从本期开始往后的内容,就更加复杂了,更多的是一些复杂的查询 SQL. 2、插入查询结果…

    MySQL 2023年4月10日
    00
  • Oracle 11g收集多列统计信息详解

    Oracle 11g收集多列统计信息详解 在Oracle 11g数据库中,我们经常需要使用收集统计信息的功能来优化查询性能。默认情况下,Oracle只会收集表的统计信息。如果表中有多个列,我们可能需要对每一个列都进行统计信息的收集。本文将在介绍如何收集多列统计信息的同时,提供两个示例来演示其操作过程。 第一步:查看当前统计信息 在开始收集多列统计信息之前,我…

    database 2023年5月21日
    00
  • MySQL中的常用函数

    MySQL中的常用函数包括字符串函数、日期函数、数学函数、聚合函数等等,这些函数方便我们对数据进行更精细的操作,让我们来一一介绍一下。 1. 字符串函数 1.1 CONCAT函数 CONCAT函数用于连接字符串,将多个字符串拼接成一个字符串。示例: SELECT CONCAT(‘hello’,’world’); — 输出’helloworld’ 1.2 L…

    database 2023年5月22日
    00
  • PostgreSQL使用MySQL作为外部表(mysql_fdw)

    PostgreSQL是一个开源的关系型数据库管理系统,是业界感觉较高的一款数据库,而MySQL也是个非常流行的数据库。假如我们需要在PostgreSQL中操作MySQL的表,那么可以使用mysql_fdw这个扩展模块。 mysql_fdw是PostgreSQL的外部数据连接插件,通过创建外部表与MySQL的表进行关联,就能够实现在PostgreSQL中操作M…

    database 2023年5月22日
    00
  • 数据库sql语句优化

    数据库SQL语句优化是提高数据库查询性能的关键措施之一。本篇文章将分享一些优化SQL查询的技巧和注意事项。 SQL语句优化的基本原则 减少查询次数:减少查询次数是优化SQL语句的首要原则。 减少数据处理量:仅返回必要的数据,并尽量避免对结果集进行额外的处理。 减少资源占用:尽量减少临时表的创建、大规模的排序操作和使用不必要的索引,以减少资源占用。 SQL语句…

    database 2023年5月19日
    00
  • MySQL 性能优化的最佳20多条经验分享

    MySQL 性能优化是一个非常重要的领域,通过优化MySQL性能可提高网站访问速度、用户体验和查询效率。下面我将分享MySQL性能优化的最佳20多条经验,希望对你有所帮助。 1. 使用优化配置 MySQL默认配置不一定是最优的,通过修改配置文件可以提高MySQL性能。具体的优化配置请参考《MySQL性能优化的最佳20多条经验分享》。 2. 避免大量使用”SE…

    database 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部