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日

相关文章

  • 格式导致的Excel导入sql出现异常的解决方法

    下面我将详细讲解“格式导致的Excel导入sql出现异常的解决方法”的完整攻略: 问题描述 在Excel中编辑数据后,使用Excel自带的“导出数据到文本”功能,并将数据导入到sql数据库中时,可能会导致数据异常,出现问题的常见原因是Excel的数据格式与数据库中的格式不兼容。 解决方法 为了解决这个问题,我们应该采取以下措施: 1. 检查Excel中的数据…

    database 2023年5月21日
    00
  • mysql 按照时间段来获取数据的方法

    获取 MySQL 数据库中某个时间段之内的数据是开发中经常遇到的问题,在 MySQL 中,可以使用 WHERE 子句的 BETWEEN 运算符或者 > 和 < 运算符来实现。下面是具体步骤: 步骤一:准备数据 首先,我们需要准备一张包含时间信息的表,例如: CREATE TABLE `mytable` ( `id` int(11) NOT NUL…

    database 2023年5月22日
    00
  • 如何单机部署多个 MySQL 8.0 实例 ?

    在服务器资源有限的情况下,可利用该方案快速搭建各类 mysql 架构方案。各 MySQL 实例共享一个 mysqld 主程序,但各实例数据目录是独立的,存放在不同的文件夹中;好了、废话不多说,直接上干货,具体搭建步骤如下 环境介绍 实例 主机 mysql port mysqlx port datadir mysql1 192.168.31.100 3306 …

    MySQL 2023年4月8日
    00
  • Mysql时间轴数据 获取同一天数据的前三条

    针对这个问题,我可以给出以下攻略: 获取同一天数据的前三条 1.利用MySQL中的DATE()函数 如果我们想获取同一天的数据,我们就需要对 MySQL 中的数据进行一定的筛选。这里我们可以使用 MySQL 中自带的日期函数 DATE(),将原始时间戳转化为日期格式进行筛选,然后再对结果进行截取,获取前三条记录。 SELECT * FROM `table_n…

    database 2023年5月22日
    00
  • SQL Server中搜索特定的对象

    要在SQL Server中搜索特定的对象,可以采用如下两种方法: 方法一:使用SQL Server Management Studio (SSMS)中的对象资源管理器 步骤如下: 打开SSMS并登录到你的SQL Server实例。 单击“对象资源管理器”按钮,这将打开”对象资源管理器“面板。 在树形结构目录中选择你要搜索的数据库。 右键单击数据库名称并选择“…

    database 2023年5月21日
    00
  • 使用shell脚本一键部署LNMP架构的方法

    使用shell脚本一键部署LNMP架构的方法需要以下几个步骤: 1. 安装必要的软件 在使用shell脚本部署LNMP之前,需要安装以下软件:- Git:用于从Github上下载LNMP的脚本文件;- Nginx:用于提供HTTP服务并负责反向代理PHP-FPM;- MySQL:用于存储数据;- PHP:用于解析PHP代码;- PHP-FPM:用于处理PHP…

    database 2023年5月22日
    00
  • linux 基础命令大全

    Linux 基础命令大全攻略 Linux 操作系统作为一款开源的操作系统,拥有很多强大的命令行工具,可以让 Linux 用户更加高效地进行操作。在本攻略中,我们将为大家介绍一些常用的 Linux 命令,并提供一些示例说明。 目录 常用命令 文件和目录 文本编辑器 常用命令 pwd 描述:显示当前工作目录的路径。 示例: $ pwd /home/user cd…

    database 2023年5月22日
    00
  • MySQL数据库表空间回收的解决

    MySQL数据库表空间回收是一个重要的问题,它关系到数据库的空间效率和性能。当数据库中的表被删除或者表中的数据被删除时,MySQL并不会立即将表占用的磁盘空间释放出来,而是将这些空闲的磁盘空间标记为“已用”,等待下一次写入操作时再用到。 这样,就会造成数据库的空间浪费,同时也会影响数据库的性能。为了解决这个问题,我们可以采取如下方法: 方法一:利用OPTIM…

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