当前位置: 首页 > news >正文

MyBatis与Spring整合优化实战指南:从配置到性能调优

一、SqlSessionFactory配置最佳实践

1.1 数据源配置优化

<!-- Spring配置示例 -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb?useSSL=false"/><property name="username" value="root"/><property name="password" value="secret"/><!-- HikariCP核心参数 --><property name="maximumPoolSize" value="20"/><property name="connectionTimeout" value="30000"/><property name="idleTimeout" value="600000"/><property name="maxLifetime" value="1800000"/>
</bean>

1.2 MyBatis核心配置

<!-- mybatis-config.xml -->
<configuration><settings><setting name="mapUnderscoreToCamelCase" value="true"/><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/></settings><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="helperDialect" value="mysql"/><property name="reasonable" value="true"/></plugin></plugins>
</configuration>

1.3 Spring整合配置

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="configLocation" value="classpath:mybatis-config.xml"/><property name="mapperLocations" value="classpath*:mapper/**/*.xml"/>
</bean>

二、事务管理深度解析

2.1 声明式事务配置

@Configuration
@EnableTransactionManagement
public class TransactionConfig {@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Beanpublic TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {return new TransactionTemplate(transactionManager);}
}
@Service
public class UserService {@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,rollbackFor = Exception.class)public void updateUser(User user) {// 业务逻辑}
}

2.2 编程式事务模板

@Autowired
private TransactionTemplate transactionTemplate;public void batchUpdate(List<User> users) {transactionTemplate.execute(status -> {users.forEach(user -> {userMapper.update(user);});return true;});
}

三、N+1查询问题解决方案

3.1 联表查询优化

<!-- PostMapper.xml -->
<select id="selectPostsWithComments" resultMap="PostResultMap">SELECT p.*, c.*FROM post pLEFT JOIN comment c ON p.id = c.post_id
</select><resultMap id="PostResultMap" type="Post"><id property="id" column="id"/><result property="title" column="title"/><collection property="comments" ofType="Comment"><id property="id" column="comment_id"/><result property="content" column="content"/></collection>
</resultMap>

3.2 延迟加载策略

<!-- 局部延迟加载配置 -->
<resultMap id="UserResultMap" type="User"><association property="department" javaType="Department"select="com.example.mapper.DepartmentMapper.selectById"column="dept_id"fetchType="lazy"/>
</resultMap>

3.3 批量查询优化

// 使用BatchExecutor
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {UserMapper mapper = sqlSession.getMapper(UserMapper.class);users.forEach(user -> {mapper.update(user);});sqlSession.commit();
}

四、性能调优实践

4.1 分页查询优化

// 使用PageHelper
PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.selectAll();
PageInfo<User> pageInfo = new PageInfo<>(users);

4.2 缓存配置

<!-- 二级缓存配置 -->
<cache eviction="LRU"flushInterval="60000"size="512"readOnly="true"/>

4.3 执行计划分析

EXPLAIN SELECT p.*, c.*
FROM post p
LEFT JOIN comment c ON p.id = c.post_id
WHERE p.create_time > '2025-01-01';

五、常见问题解决方案

5.1 连接泄漏处理

@Bean
public DataSource dataSource() {HikariDataSource ds = new HikariDataSource();ds.setLeakDetectionThreshold(30000); // 30秒泄漏检测return ds;
}

5.2 事务未生效排查

  1. 检查@Transactional注解是否在public方法上
  2. 确认是否启用了@EnableTransactionManagement
  3. 验证数据库引擎是否支持事务(如InnoDB)

5.3 延迟加载失效处理

<!-- 强制使用CGLIB代理 -->
<setting name="proxyFactory" value="CGLIB"/>

六、总结

通过合理配置SqlSessionFactory、选择合适的事务管理方式,以及采用联表查询、延迟加载等技术手段,可以有效解决MyBatis与Spring整合中的性能瓶颈。实际开发中应根据具体场景权衡配置,建议通过压测工具(如JMeter)持续优化数据库访问性能。

http://www.lryc.cn/news/589530.html

相关文章:

  • Conda 核心命令快速查阅表
  • 系统编程是什么
  • 22-C#的委托简单使用-2
  • ai问答推荐企业排名优化?:五大企业核心竞争力全景对比
  • 从0开始学习R语言--Day47--Nomogram
  • 【51单片机先流水2秒后数码显示2秒后显示END】2022-9-5
  • 判断QMetaObject::invokeMethod()里的函数是否调用成功
  • 密码协议的基本概念
  • 【Linux手册】重定向是如何实现的?Linux下为什么一切皆文件?
  • 【env环境】rtthread5.1.0使用fal组件
  • npm install failed如何办?
  • 差分信号接口选型指南:深入解析LVDS、SubLVDS、SLVDS与SLVDS-EC**
  • 回顾一下Docker的基本操作
  • 项目:从零开始制作一个微信小程序(第六天)
  • 专业文档搜索工具,快速定位文本内容
  • Spring AI Alibaba 1.0 vs Spring AI 深度对比
  • EPLAN 电气制图(九):直流电源绘制+端子排绘制
  • 3.创建表-demo
  • 深入解析环境变量:从基础概念到系统级应用
  • 墨刀原型图的原理、与UI设计图的区别及转换方法详解-卓伊凡|贝贝
  • TypeScript之旅
  • 基于STM32与中航ZH-E3L字符卡通信在LED屏显示数据
  • ArrayList列表解析
  • [附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+vue实现的酒店预订管理系统,推荐!
  • Nestjs框架: 数据库架构设计与 NestJS 多 ORM 动态数据库应用与连接池的配置
  • 缓存穿透的“黑暗森林”假说——当攻击者学会隐藏恶意流量
  • 园区用电成本直降方案:智能微网调控系统一键峰谷优化
  • PHP语法高级篇(三):Cookie与会话
  • OSPF过滤
  • 数据结构——顺序表的相关操作