执行器
以下是 MyBatis 中的三种执行器的详细说明、优缺点和适合场景以及配置代码:
- SimpleExecutor
SimpleExecutor 是 MyBatis 默认的执行器,它是一种非常简单的执行器。对于每次执行的 SQL 语句,SimpleExecutor 都会创建一个新的 Statement 对象,用完即关闭。SimpleExecutor 的优点在于它非常简单,可以很快地执行 SQL 语句,适合处理简单的 SQL 语句。
优点:
- 简单,易于实现。
- 每次执行都会创建一个新的 Statement 对象,避免了 Statement 对象的共享问题。
缺点:
- 每次执行都会创建一个新的 Statement 对象,增加了系统开销。
- 不支持 Statement 对象的缓存,无法复用已经创建的 Statement 对象,影响性能。
适合场景:
- 处理简单的 SQL 语句。
- SQL 语句较少,不需要缓存 Statement 对象。
配置代码:
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
<mapperScan basePackage="com.example.mapper" />
<configuration>
<defaultExecutorType type="SIMPLE" />
</configuration>
</environment>
</environments>
</configuration>
- ReuseExecutor
ReuseExecutor 是一种可重用的执行器,它会检查是否有可复用的 Statement 对象,如果有则重用,否则创建一个新的 Statement 对象。相较于 SimpleExecutor,ReuseExecutor 可以避免频繁创建和销毁 Statement 对象,提高了性能。
优点:
- 可复用 Statement 对象,避免了频繁创建和销毁 Statement 对象,提高了性能。
- 对于重复的 SQL 语句可以重用 Statement 对象,提高了性能。
缺点:
- 无法缓存 PreparedStatement 对象,对于动态 SQL 语句性能不如 BatchExecutor。
适合场景:
- 处理比较复杂的 SQL 语句,需要复用 Statement 对象。
- SQL 语句较少,不需要缓存 PreparedStatement 对象。
配置代码:
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
<mapperScan basePackage="com.example.mapper" />
<configuration>
<defaultExecutorType type="REUSE" />
</configuration>
</environment>
</environments>
</configuration>
- BatchExecutor
BatchExecutor 是一种批处理执行器,可以将多个 SQL 语句放在同一批处理中执行,减少了通信次数,提高了性能。BatchExecutor 还支持 PreparedStatement 对象的缓存,对于动态 SQL 语句性能也比较好。
优点:
- 可以将多个 SQL 语句放在同一批处理中执行,减少了通信次数,提高了性能。
- 支持 PreparedStatement 对象的缓存,对于动态 SQL 语句性能较好。
缺点:
- 处理 SQL 语句较为复杂,需要组织批处理语句。
适合场景:
- 处理大量的 SQL 语句,需要批量执行。
- 处理动态 SQL 语句,需要缓存 PreparedStatement 对象。
配置代码:
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
<mapperScan basePackage="com.example.mapper" />
<configuration>
<defaultExecutorType type="BATCH" />
</configuration>
</environment>
</environments>
</configuration>
其实还有一种执行器,它的主要功能是缓存,为了mybatis实现了缓存相关的功能,默认无需配置只需要开启缓存,就可以启用。
缓存相关的执行器和类
- CachingExecutor
CachingExecutor 是 MyBatis 中的缓存执行器,它可以在执行 SQL 语句时缓存查询结果,避免每次查询都要重新执行 SQL 语句,提高了查询性能。CachingExecutor 内部使用了装饰器模式,可以将查询结果缓存到内存中,也可以将查询结果缓存到二级缓存中。
优点:
- 可以缓存查询结果,避免每次查询都要重新执行 SQL 语句,提高了查询性能。
- 可以将查询结果缓存到内存中或者二级缓存中,提高了查询效率。
缺点:
- 缓存查询结果会消耗内存,需要根据实际情况进行配置。
- 如果查询结果经常变化,缓存查询结果会导致数据不一致。
适合场景:
- 查询结果较为稳定,不会经常变化。
- 查询结果查询频率很高。
配置代码:
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
<mapperScan basePackage="com.example.mapper" />
<configuration>
<defaultExecutorType type="CACHING" />
</configuration>
</environment>
</environments>
</configuration>
- PerpetualCache
PerpetualCache 是 MyBatis 中的永久缓存,它将查询结果缓存到内存中,永久保存。PerpetualCache 的缓存策略非常简单,只要缓存中有对应的查询结果,就直接返回缓存结果。PerpetualCache 适用于查询结果较为稳定,不会经常变化的情况。
优点:
- 简单,易于实现。
- 缓存查询结果到内存中,查询效率高。
缺点:
- 缓存查询结果会消耗内存,需要根据实际情况进行配置。
- 如果查询结果经常变化,缓存查询结果会导致数据不一致。
适合场景:
- 查询结果较为稳定,不会经常变化。
- 查询结果查询频率很高。
配置代码:
<cache type="PERPETUAL">
<property name="size" value="1024" />
<property name="flushInterval" value="60000" />
</cache>
- LruCache
LruCache 是 MyBatis 中的 LRU 缓存,它可以缓存查询结果,并定期清理最近最少使用的查询结果,避免缓存占用过多内存。LruCache 使用 LinkedHashMap 实现,可以按照查询结果的访问顺序进行排序,将最近最少使用的查询结果清除。LruCache 适用于查询结果较多,缓存占用内存较大的情况。
优点:
- 缓存查询结果到内存中,查询效率高。
- 可以定期清理最近最少使用的查询结果,避免缓存占用过多内存。
缺点:
- 缓存查询结果会消耗内存,需要根据实际情况进行配置。
- 如果查询结果经常变化,缓存查询结果会导致数据不一致。
适合场景:
- 查询结果较多,缓存占用内存较大。
- 查询结果查询频率较高,但查询结果经常变化。
配置代码:
<cache type="LRU">
<property name="size" value="1024" />
<property name="flushInterval" value="60000" />
</cache>
文章评论