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

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.xdnf.cn/news/15645.html

相关文章:

  • 《每日AI-人工智能-编程日报》--2025年7月15日
  • mongoDB的CRUD
  • C++ Boost Aiso TCP 网络聊天(服务端客户端一体化)
  • QGIS新手教程9:字段计算器进阶用法与批量处理技巧
  • 操作HTML网页的知识点
  • Linux下调试器gdb/cgdb的使用
  • Unity 多人游戏框架学习系列一
  • 23.将整数转换为罗马数字
  • 全局 WAF 规则:构筑 Web 安全的坚固防线
  • 设计模式一: 模板方法模式 (Template Method Pattern)
  • 基于 AI 的大前端安全态势感知与应急响应体系建设
  • 检查WSL2子系统文件大小并删除
  • 《星盘接口10:时空回响》
  • OpenAI GPT-4o技术详解:全能多模态模型的架构革新与生态影响
  • 虚拟主机CPU占用100导致打不开的一次处理
  • 利用模型生成每个样本每个特征的 SHAP 值
  • 【Git 中的 branch 工作流】关于git 中 branch 的一些基本操作
  • 【每日算法】专题十_字符串
  • 小架构step系列15:白盒集成测试
  • Translational Psychiatry | 通过流形学习和网络分析揭示精神分裂症与双相I型障碍的差异性精神病症状
  • 音视频学习(三十九):IDR帧和I帧
  • 《黑马笔记》 --- C++核心编程
  • PHP安全漏洞深度解析:文件包含与SSRF攻击的攻防实战
  • 在新闻资讯 APP 中添加不同新闻分类页面,通过 ViewPager2 实现滑动切换
  • 网络基础协议综合实验
  • GeoTools 工厂设计模式
  • 【Linux庖丁解牛】— 保存信号!
  • SAP学习笔记 - 开发45 - RAP开发 Managed App New Service Definition,Metadata Extension
  • C++中list各种基本接口的模拟实现
  • 25、企业能源管理(Energy):锚定双碳目标,从分类管控到智能优化的数字化转型之路