Spring嵌入式Tomcat数据源性能远低于外部Tomcat问题排查与解决
嵌入式Tomcat下Spring+EclipseLink JPA性能暴跌问题解决记录
问题表现
在使用EclipseLink JPA搭建Spring与MySQL的连接时,遇到异常性能差异:
- 同一个读取大量实体的密集型接口,在外部独立Tomcat运行仅耗时800ms
- 切换到嵌入式Tomcat运行时,耗时飙升至17秒
- 数据库连接数差异明显:嵌入式Tomcat占用20个连接,外部Tomcat仅用10个
已尝试的无效操作
最初怀疑是环境配置差异,尝试以下操作均无改善:
- 将嵌入式Tomcat版本调整为与外部完全一致
- 复制外部Tomcat的所有配置到嵌入式环境
- 禁用
EmbeddedServletContainerCustomizer的reloadable属性
根因定位
通过主动触发事务异常并对比两边日志,最终发现:嵌入式Tomcat未正确加载HikariCP配置,默认使用了低效的数据源实现,导致性能雪崩。
解决方案
改用HikariCP的标准编程式配置,确保嵌入式Tomcat能正确识别并启用高性能连接池,示例代码如下:
@Bean public DataSource dataSource() { HikariConfig hikariConfig = new HikariConfig(); hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/your_database"); hikariConfig.setUsername("db_user"); hikariConfig.setPassword("db_pass"); hikariConfig.setMaximumPoolSize(10); // 与外部Tomcat统一连接池大小 hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver"); // 可按需添加连接超时、空闲超时等HikariCP优化参数 return new HikariDataSource(hikariConfig); }
配置完成后,嵌入式Tomcat的性能恢复至与外部Tomcat一致的水平。
内容的提问来源于stack exchange,提问作者vrivon
相关产品推荐
相关产品推荐

