针对“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技术站