选择高性能连接池实现:Tomcat默认使用Apache DBCP 2连接池,但HikariCP(轻量级、高性能)是更优选择。例如,HikariCP的配置示例(context.xml):
<Resource name="jdbc/MyDB"
auth="Container"
type="javax.sql.DataSource"
factory="com.zaxxer.hikari.HikariJNDIFactory"
maximumPoolSize="100"
minimumIdle="10"
idleTimeout="30000"
connectionTimeout="10000"
username="dbuser"
password="dbpassword"
jdbcUrl="jdbc:mysql://localhost:3306/mydatabase"/>
核心参数调优:
maximumPoolSize):根据CPU核心数(10-20/核)和数据库承受能力设置(如50-200),避免过大导致数据库线程切换开销;maxTotal的50%-70%(如maxTotal=100时,maxIdle=50-70),避免过多空闲连接占用资源;maxIdle的1/4(如maxIdle=50时,minIdle=10-12),保证基础连接可用,减少峰值等待时间;SELECT 1验证连接有效性;true(后台检测无效连接),testOnBorrow设为false(避免借出时验证的性能开销);索引优化:为查询条件、排序字段、连接字段创建合适的索引(如WHERE子句中的字段、ORDER BY字段),遵循最左前缀原则设计复合索引(如(user_id, create_time)),避免创建冗余或重复索引。
SQL语句优化:
SELECT *,仅检索所需列(如SELECT id, name FROM users);LIMIT控制结果集规模(如SELECT * FROM orders LIMIT 10);JOIN替代子查询(如SELECT u.name, o.amount FROM users u JOIN orders o ON u.id = o.user_id)。EXPLAIN命令检查SQL执行计划,确保查询达到ref或range级别(避免ALL全表扫描),例如:EXPLAIN SELECT * FROM products WHERE category_id = 5;
表结构优化:选择合适的数据类型(如用INT替代VARCHAR存储数字、用VARCHAR(255)替代CHAR(255)节省空间),避免过度设计。
慢查询日志:开启MySQL慢查询日志(slow_query_log=1,long_query_time=1),定期分析并优化执行慢的SQL语句。
启用泄漏检测:在Tomcat的context.xml中配置以下参数,检测未正确关闭的连接:
<Resource name="jdbc/MyDB"
...
removeAbandonedOnBorrow="true"
removeAbandonedOnMaintenance="true"
removeAbandonedTimeout="60"
logAbandoned="true"/>
removeAbandonedOnBorrow:从连接池获取连接时检查泄漏;removeAbandonedTimeout:连接超过60秒未归还视为泄漏;logAbandoned:记录泄漏连接的堆栈跟踪,便于定位代码问题。finally块中关闭Connection、Statement、ResultSet(按创建顺序逆向关闭),例如:Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM users");
// 处理结果集...
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (rs != null) try { rs.close(); } catch (SQLException e) { /* 忽略 */ }
if (stmt != null) try { stmt.close(); } catch (SQLException e) { /* 忽略 */ }
if (conn != null) try { conn.close(); } catch (SQLException e) { /* 忽略 */ }
}
堆内存配置:设置合理的初始堆大小(-Xms)和最大堆大小(-Xmx),避免频繁垃圾回收(如-Xms512m -Xmx1024m,建议-Xms与-Xmx一致,减少内存扩容开销)。
垃圾回收器选择:优先使用G1GC(适合大内存环境,减少停顿时间),例如:
export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"
新生代与老年代比例:通过-XX:NewRatio调整(如-XX:NewRatio=2,表示新生代占堆的1/3,老年代占2/3),根据应用特点优化(如频繁创建对象的场景可适当增大新生代)。
在Tomcat的server.xml中配置Connector,启用Gzip压缩减少网络传输数据量(适用于文本类响应,如HTML、JSON、CSS、JS):
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/plain,application/json"
connectionTimeout="20000"
redirectPort="8443"/>
compression="on":开启压缩;compressionMinSize="2048":响应内容大于2KB时才压缩(避免小文件压缩反而增加CPU开销);compressableMimeType:指定需要压缩的MIME类型。