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日

相关文章

  • Redis监控技巧总结

    Redis监控技巧总结 1. 监控Redis性能 1.1 配置Redis监控 在Redis配置文件redis.conf中,可以通过设置各种参数来监控Redis性能。其中比较常用的参数有: maxmemory 指定Redis使用的最大内存。当Redis使用的内存超过这个限制时,会触发内存回收机制,清除一些过期和不常用的数据。 maxclients 指定Redi…

    database 2023年5月22日
    00
  • MySQL数据库优化经验详谈(服务器普通配置)

    MySQL数据库优化经验详谈(服务器普通配置) 1. 使用存储引擎InnoDB InnoDB存储引擎支持事务处理,保证了数据的一致性和可靠性,具有更好的性能和灵活性。因此,建议在MySQL中使用InnoDB存储引擎。 2. 合理设置缓存 缓存对于MySQL服务器来说非常重要,合理设置缓存可以提升系统性能。可以通过修改my.cnf文件,设置query_cach…

    database 2023年5月19日
    00
  • 【MySQL】索引和锁

    前言 本文摘自数据库两大神器【索引和锁】 InnoDB存储引擎 索引 在之前,我对索引有以下的认知: 索引可以加快数据库的检索速度 表经常进行INSERT/UPDATE/DELETE操作就不要建立索引了,换言之:索引会降低插入、删除、修改等维护任务的速度。 索引需要占物理和数据空间。 了解过索引的最左匹配原则 知道索引的分类:聚集索引和非聚集索引 Mysql…

    MySQL 2023年4月12日
    00
  • redis数据库拷贝

    import redis r = redis.Redis(host=’58.221.49.23′,password=’123456′,port=6379) for i in r.lrange(‘yhd:info_urls’,0,745): r.lpush(‘yhd:info_urls_back’,i)  

    Redis 2023年4月12日
    00
  • SqlServer 实用操作小技巧集合

    SqlServer 实用操作小技巧集合 对于 SqlServer 数据库的应用开发人员,常常会遇到一些繁琐的细节操作,下面将为大家分享一些实用操作小技巧,帮助大家更加高效地处理 SqlServer 数据库操作。 将多行数据合并成一行 当需要将多行数据合并成一行时,可以使用 SQL Server 中的 STUFF 和 FOR XML PATH() 函数。 示例…

    database 2023年5月21日
    00
  • mysql查询学生表里面成绩第2名的学生成绩

    如图:    多表关联写法:    

    MySQL 2023年4月13日
    00
  • windows下php7.1安装redis扩展以及redis测试使用全过程(转)

     最近做项目,需要用到redis相关知识。在Linux下,redis扩展安装起来很容易,但windows下还是会出问题的。因此,特此记下自己实践安装的整个过程,以方便后来人。      一,php中redis扩展安装配置    1, 首先第一点,也是最重要一点是,你要知道你的php版本信息,这会决定你的扩展文件版本。特别需要记住一点的是,redis选择x64…

    Redis 2023年4月11日
    00
  • oracle11g管理员密码忘记怎么办 sqlplus解决忘记密码问题

    如果忘记了Oracle11g数据库管理员账户的密码,可以使用SQL*Plus工具通过重置密码来解决该问题。 步骤一:以管理员身份登录到Windows 首先,以管理员身份登录到Windows服务器或虚拟机。 步骤二:停止Oracle服务 使用管理员权限,在Windows命令提示符下停止Oracle服务,可以通过以下命令来完成: net stop OracleS…

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