当前位置: 首页 > 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://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://.
http://www.dtcms.com/a/280135.html

相关文章:

  • mysql 索引失效的场景
  • HashMap深入讲解
  • 从零开始的python学习(八)P115+P116+P117+P118+P119+P120+P121+P122
  • 部署本地大模型 Ollama + LLaMA3
  • Java基础(八):封装、继承、多态与关键字this、super详解
  • GPIO 输入/输出
  • GEO革命:当AI推荐成为新战场,传统SEO如何进化?
  • Linux基础学习---目录相关命令
  • 手机当路由,连接机器人和电脑
  • Typecho插件开发:实现文章字数统计与阅读时长计算功能
  • docker 方式gost代理搭建以及代理链实施
  • Android弹窗
  • uniapp中全局引入ronMounted, ref,watch onLoad,onShow等
  • Vim多列操作指南
  • docker-compose 配置启动2个MongoDB
  • SQL 常用版本语法概览:标准演进与关键语法分析
  • bat 批处理实现 FFmpeg 命令导出 mov 到 png 序列帧
  • 新版本PyCharm Conda环境设置 “找不到conda可执行文件”的解决
  • Git分支管理与工作流详解
  • 记录一条sql面试题2
  • MyBatis动态语法标签速查
  • Fastapi框架总览与核心架构
  • iOS App 上架工具选型与跨平台开发 iOS 上架流程优化实录
  • 深入探讨Hadoop YARN Federation:架构设计与实践应用
  • Datawhale AI数据分析 笔记
  • 2025开放原子开源生态大会 | openKylin的技术跃迁和全球协作
  • 回顾一下Docker的基本操作
  • Linux部署Python服务
  • 面向医疗AI场景的H20显卡算力组网方案
  • 2025开放原子开源生态大会 | 开源欧拉的AI原生实践与全球协作