一、数据库层面优化(慢查询根源优化)
WHERE a=1 AND b=2需创建(a,b)复合索引),避免创建冗余或重复索引(如同一字段的多个单列索引)。SELECT *,仅查询必要列;利用覆盖索引(索引包含查询所需的所有列)减少回表操作;合理使用JOIN替代子查询(JOIN通常比子查询更高效);用LIMIT限制结果集规模(如分页查询时使用LIMIT offset,size)。INT替代BIGINT、VARCHAR(50)替代CHAR(50));用VARCHAR代替CHAR(VARCHAR是变长存储,节省空间)。EXPLAIN命令分析查询执行计划,重点关注type字段(需达到ref或range级别,优于ALL全表扫描),识别性能瓶颈(如未走索引、临时表使用过多)。二、Tomcat配置优化
-Xms初始堆大小、-Xmx最大堆大小,建议设置为服务器物理内存的70%-80%,如-Xms512m -Xmx1024m);选择合适的垃圾回收器(大内存环境用G1GC(-XX:+UseG1GC),多核CPU环境用Parallel GC(-XX:+UseParallelGC));调整新生代与老年代比例(-XX:NewRatio,如2表示新生代占堆的1/3);设置并行GC线程数(-XX:ParallelGCThreads,建议设置为CPU核心数的1-2倍,如-XX:ParallelGCThreads=4)。server.xml的Connector标签中启用压缩(compression="on"),设置压缩最小阈值(compressionMinSize="2048",单位字节)和可压缩的MIME类型(compressableMimeType="text/html,text/xml,text/plain,application/json"),减少数据传输量,提升页面加载速度。三、慢查询识别与分析
grep命令筛选慢查询(如grep 'QTime' catalina.out | awk -F 'QTime=' '{if ($2 > 800) print $0}',筛选QTime超过800毫秒的记录);使用awk脚本自动化处理(如统计慢查询次数、提取关键信息);借助mysqldumpslow(MySQL)、pt-query-digest(Percona Toolkit)等工具分析慢查询日志,找出执行时间最长、频率最高的查询。Prometheus+Grafana搭建实时监控体系,监控Tomcat的请求响应时间、数据库查询耗时、慢查询数量等指标,设置告警阈值(如慢查询数量超过10次/分钟),及时触发告警通知运维人员。四、架构与代码优化
Redis、Memcached等内存缓存系统,缓存热点数据(如商品详情、用户信息),减少对数据库的直接访问(降低数据库负载);设置合理的缓存过期时间(如TTL=3600秒),避免脏数据。Spring Async、RabbitMQ消息队列),避免阻塞主线程,缩短请求响应时间。HashMap替代List进行快速查找);减少循环中的复杂计算(如将循环外的常量计算提前到循环外)。五、其他优化措施
server.xml的Connector标签中设置合适的线程池大小(maxThreads,如200),根据并发请求数调整(建议设置为CPU核心数×200,如4核CPU设置为800),避免线程池过小导致请求排队、过大导致资源耗尽。logging.properties文件,调整日志级别(如将DEBUG改为INFO或WARN),减少调试信息的输出;关闭不必要的日志组件(如AccessLogValve的详细日志),降低磁盘I/O压力。/dev/random熵池不足(熵池用于生成随机数),可通过安装rng-tools(sudo apt-get install rng-tools)增大熵池(sudo rngd -r /dev/urandom),或修改java.security文件(将securerandom.source=file:/dev/random改为securerandom.source=file:/dev/./urandom),提升随机数生成速度。