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

yizhihongxing

针对“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日

相关文章

  • .net Redis分布式锁,Dictionary,ConcurrentDictionary 介绍

    在计算机世界里,对于锁大家并不陌生,在现代所有的语言中几乎都提供了语言级别锁的实现,为什么我们的程序有时候会这么依赖锁呢?这个问题还是要从计算机的发展说起,随着计算机硬件的不断升级,多核cpu,多线程,多通道等技术把计算机的计算速度大幅度提升,原来同一时间只能执行一条cpu指令的时代已经过去。随着多条cpu指令可以并行执行的原因,原来不曾出现的资源竞争随着出…

    Redis 2023年4月11日
    00
  • Mysql常用sql语句汇总

    Mysql是一种常用的关系型数据库管理系统,在进行数据库操作时,需要掌握常用的sql语句。接下来我们将为大家讲解“Mysql常用sql语句汇总”的完整攻略。 一、查询语句 1.1 SELECT语句 SELECT语句是使用最广泛的查询语句,可以用来查询表中的数据。SELECT语句的基本语法如下: SELECT [DISTINCT] column1, colum…

    database 2023年5月21日
    00
  • Oracle出现超出打开游标最大数的解决方法

    当Oracle数据库中打开的游标数超过了数据库的最大游标数限制时,就会出现“超出打开游标最大数”的错误。 常见的解决方法有以下几种: 方法一:增加最大游标数量 首先,需要查看当前最大游标数限制: SHOW parameter open_cursors; 然后,通过以下命令修改最大游标数量: ALTER SYSTEM SET open_cursors=1000…

    database 2023年5月21日
    00
  • SQL Server 2014 数据库中文版安装图文教程

    SQL Server 2014 数据库中文版安装图文教程 本文主要介绍如何安装 SQL Server 2014 数据库中文版以及使用过程中注意事项。以下为详细步骤: 步骤一:下载 SQL Server 2014 数据库中文版 前往 Microsoft官网 下载 SQL Server 2014 数据库中文版安装包。 步骤二:运行安装包 下载完成后,双击运行安装…

    database 2023年5月18日
    00
  • MySQL优化服务器,提高MySQL的运行速度!

    MySQL是一款开放源代码的关系型数据库管理系统。在使用MySQL时,为了提高系统的性能和稳定性,通常需要对服务器进行优化。本文将详细介绍如何优化MySQL服务器,以提高其运行速度。 升级硬件 首先,升级硬件是提高服务器性能的首要条件。硬件升级主要包括CPU、内存和硬盘。在升级硬件时,应该根据服务器的实际情况选择合适的硬件配置。 优化MySQL配置文件 My…

    MySQL 2023年3月10日
    00
  • MySQL中MIN()函数的使用教程

    MySQL中MIN()函数的使用教程 1. MIN()函数简介 在MySQL中,MIN()函数用于求一组数据中的最小值。可以用于数值型,日期型和字符串类型数据。 2. MIN()函数语法 MIN()函数语法如下: SELECT MIN(exp) FROM table_name WHERE conditions; 3. MIN()函数示例 3.1 数值型数据 …

    database 2023年5月22日
    00
  • 如何使用Python在MySQL中创建数据库?

    要使用Python在MySQL中创建数据库,可以使用Python的内置模块sqlite3或第三方库mysql-connector-python。以下是使用mysql-connector-python在MySQL中创建数据库的完整攻略: 连接 要连接到MySQL,需要提供MySQL的主机名、用户名、和密码。可以使用以下代码连接MySQL: import mys…

    python 2023年5月12日
    00
  • CentOS7.5安装配置Harbor1.7的全过程

    CentOS7.5安装配置Harbor1.7的全过程 简介 Harbor是企业级的Docker镜像仓库,提供安全、可靠的镜像管理功能,支持LDAP、AD认证、权限管理、日志审计等企业级功能。本文将详细介绍在CentOS7.5上安装配置Harbor1.7的全过程。 准备 安装了CentOS7.5操作系统的服务器,具备root权限。 安装Docker Harbo…

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