1. 分析慢查询根源
首先需要明确慢查询的具体来源(如数据库查询慢、Tomcat线程阻塞等)。对于数据库慢查询,可通过数据库自带的慢查询日志功能捕捉(如MySQL中设置slow_query_log=ON、long_query_time=2(单位:秒)),或使用mysqldumpslow等工具分析日志,找出执行时间长、频率高的查询语句;对于Tomcat本身的性能瓶颈(如线程等待、内存溢出),可通过JDK自带的jstack(查看线程堆栈)、jmap(分析内存使用)等工具定位。
2. 优化数据库查询
(a,b,c)可用于查询a=1 AND b=2或a=1,但不适用于b=2),避免创建冗余或重复索引(如同一字段的多个单列索引)。SELECT *(仅查询需要的列),减少数据传输量;使用覆盖索引(查询的列都在索引中,无需回表查询数据行),提升查询效率;合理使用JOIN(优先于子查询,减少嵌套查询次数);用LIMIT限制结果集大小(如分页查询时使用LIMIT offset, size)。INT代替VARCHAR存储数字,用VARCHAR(255)代替CHAR(255)节省存储空间);定期清理无用数据(如归档历史表),减少表的大小。EXPLAIN命令查看查询执行计划,重点关注type字段(表示访问类型,如ref、range优于ALL(全表扫描)),确保查询能达到较高的优化级别。3. 调整Tomcat配置
-Xms初始堆大小、-Xmx最大堆大小,建议设置为服务器物理内存的70%-80%,如-Xms512m -Xmx1024m);选择合适的垃圾回收器(大内存应用推荐G1GC(-XX:+UseG1GC),多核CPU应用推荐Parallel GC(-XX:+UseParallelGC));调整新生代与老年代比例(-XX:NewRatio,如2表示新生代占堆的1/3,老年代占2/3);设置并行GC线程数(-XX:ParallelGCThreads,通常设置为CPU核心数的1-2倍,如-XX:ParallelGCThreads=4)。server.xml中调整Tomcat线程池参数(maxThreads最大线程数,根据并发请求数设置,如200;minSpareThreads最小空闲线程数,如25;maxSpareThreads最大空闲线程数,如75),避免线程过多导致上下文切换开销,或线程过少导致请求排队。server.xml的Connector配置中启用HTTP压缩(compression="on"),设置压缩的最小文件大小(compressionMinSize="2048",单位:字节)和可压缩的MIME类型(compressableMimeType="text/html,text/xml,text/plain,application/json"),减少数据传输量,提升页面加载速度。4. 引入缓存机制
使用内存缓存(如Redis、Memcached)缓存热点数据(如频繁查询的商品信息、用户会话),减少对数据库的直接访问。例如,将数据库查询结果存入Redis,下次相同查询时直接从Redis获取,降低数据库负载。同时,可启用Tomcat的静态资源缓存(如Expires或Cache-Control头部),缓存CSS、JS、图片等静态文件,减少重复请求。
5. 监控与自动化
6. 其他辅助措施
rng-tools),增加熵池容量(sudo apt-get install rng-tools,sudo rngd -r /dev/urandom);或修改JRE配置(java.security文件),将securerandom.source从/dev/random改为/dev/./urandom(sudo sed -i 's/securerandom.source=file:/dev/random/securerandom.source=file:/dev/./urandom/' /path/to/jre/lib/security/java.security),提升随机数生成速度。webapps目录中无用的应用,减少Tomcat启动时的类扫描和资源加载时间;避免在web.xml中配置过多的过滤器或监听器,降低请求处理的开销。