選擇高性能連接池實現: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) { /* 忽略 */ }
}
堆內存配置:設置合理的初始堆大?。?code>-Xms)和最大堆大?。?code>-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類型。