如果有遗漏,评论区告诉我进行补充
面试官: mybatis有哪些执行器(Executor)?
我回答:
在 MyBatis 中,Executor
执行器是核心组件之一,负责处理与数据库的交互。MyBatis 提供了几种不同类型的执行器,每种执行器都有其特定的行为和用途。以下是 MyBatis 中主要的几种执行器类型及其详细说明:
1. SimpleExecutor(简单执行器)
- 特点:这是默认的执行器类型。每次执行 SQL 语句时,都会创建一个新的
PreparedStatement
对象,并且不会复用。执行完毕后,会立即关闭Statement对象。这种执行器不支持事务,适用于简单的查询场景。 - 适用场景:适用于简单的 CRUD 操作,不需要复杂的事务管理和缓存机制。
- 优点:
- 简单易用。
- 不需要额外的配置。
- 缺点:
- 性能较低,因为每次执行 SQL 都会创建新的
PreparedStatement
。 - 不适合频繁的数据库操作。
- 性能较低,因为每次执行 SQL 都会创建新的
2. ReuseExecutor(重用执行器)
- 特点:ReuseExecutor会重用预编译的Statement对象。它会将Statement对象缓存在Map中,以SQL语句为key。当需要执行相同的SQL语句时,会直接使用缓存中的Statement对象,而不是每次都创建新的对象。这种执行器同样不支持事务。
- 适用场景:适用于重复执行相同 SQL 语句的情况。
- 优点:
- 减少了
PreparedStatement
的创建次数,提高了性能。 - 适用于执行大量相同 SQL 语句的场景。
- 减少了
- 缺点:
- 缓存
PreparedStatement
可能会导致内存占用增加。 - 如果 SQL 语句中包含动态参数,可能无法正确地重用
PreparedStatement
。
- 缓存
3. BatchExecutor(批处理执行器)
- 特点:BatchExecutor用于批量操作数据库,可以一次执行多个SQL语句。它会将相同类型的SQL语句分组,并使用JDBC的批处理功能执行。这种执行器可以显著提高性能,特别适用于需要执行大量相同类型SQL语句的场景,如批量插入或更新操作。(注意: 只能执行批量更新、删除和新增操作)
- 适用场景:适用于批量插入或更新数据的场景。
- 优点:
- 大幅提高批量操作的性能。
- 减少网络 I/O 和数据库连接的开销。
- 缺点:
- 单个事务中的数据量可能会变得非常大,导致数据库压力增加。
- 如果事务失败,所有累积的操作都需要回滚,这可能会比较耗时。
4. CachingExecutor(缓存执行器)
- 特点:这种执行器不是直接与数据库交互的执行器,而是在其他执行器的基础上添加了一层缓存机制。它可以缓存查询结果,从而避免重复查询数据库。
- 适用场景:适用于读多写少的场景,特别是当数据不经常变化时。
- 优点:
- 提高查询性能,减少对数据库的压力。
- 支持多种缓存策略,如 LRU、FIFO 等。
- 缺点:
- 需要额外的配置和管理。
- 如果数据频繁变化,缓存可能会导致数据不一致的问题。
如何选择执行器
- 默认选择:如果你没有特别的需求,通常建议使用
SimpleExecutor
,因为它是最简单且最稳定的执行器。 - 性能优化:如果你的应用中有大量的重复 SQL 语句,可以考虑使用
ReuseExecutor
来提高性能。 - 批量操作:如果你有大量的插入或更新操作,可以使用
BatchExecutor
来提高批量操作的性能。 - 缓存需求:如果你希望减少对数据库的查询次数,可以使用
CachingExecutor
来实现查询结果的缓存。
配置示例
- 全局配置:可以在MyBatis的全局配置文件(如
mybatis-config.xml
)中通过<settings>
标签的defaultExecutorType
属性来全局设置默认的执行器类型。 - 会话级配置:在获取
SqlSession
时,也可以指定使用哪种执行器。如果使用的是批量执行器,并且开启了自动提交事务,需要手动提交事务才能使批量操作生效。
你可以在 MyBatis 的配置文件中指定执行器类型。例如:
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 数据源配置 --></dataSource></environment></environments><settings><setting name="defaultExecutorType" value="REUSE"/> <!-- 设置默认执行器类型为 REUSE --></settings>
</configuration>
注意事项
- 当选择批量执行器时,需要注意手动提交事务,即使在获取
SqlSession
时设置了自动提交事务。 - 缓存的使用可以提高性能,但也可能导致数据不一致的问题,特别是在高并发场景下。因此,需要根据具体的应用场景和需求来配置和管理缓存。
综上所述,MyBatis的执行器是MyBatis框架中用于执行SQL语句和映射结果到Java对象的重要组件。了解不同类型的执行器及其特点和使用场景,对于优化MyBatis的性能和应对不同的业务需求至关重要。