centos

如何优化centos tomcat数据库访问

小樊
38
2025-10-19 21:37:41
栏目: 智能运维

一、优化Tomcat数据库连接池配置

选择高性能连接池实现: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"/>

核心参数调优

二、优化数据库访问本身

索引优化:为查询条件、排序字段、连接字段创建合适的索引(如WHERE子句中的字段、ORDER BY字段),遵循最左前缀原则设计复合索引(如(user_id, create_time)),避免创建冗余或重复索引。
SQL语句优化

EXPLAIN SELECT * FROM products WHERE category_id = 5;

表结构优化:选择合适的数据类型(如用INT替代VARCHAR存储数字、用VARCHAR(255)替代CHAR(255)节省空间),避免过度设计。
慢查询日志:开启MySQL慢查询日志(slow_query_log=1long_query_time=1),定期分析并优化执行慢的SQL语句。

三、处理连接泄漏问题

启用泄漏检测:在Tomcat的context.xml中配置以下参数,检测未正确关闭的连接:

<Resource name="jdbc/MyDB"
    ...
    removeAbandonedOnBorrow="true"
    removeAbandonedOnMaintenance="true"
    removeAbandonedTimeout="60"
    logAbandoned="true"/>
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) { /* 忽略 */ }
}

四、JVM参数优化

堆内存配置:设置合理的初始堆大小(-Xms)和最大堆大小(-Xmx),避免频繁垃圾回收(如-Xms512m -Xmx1024m,建议-Xms-Xmx一致,减少内存扩容开销)。
垃圾回收器选择:优先使用G1GC(适合大内存环境,减少停顿时间),例如:

export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"

新生代与老年代比例:通过-XX:NewRatio调整(如-XX:NewRatio=2,表示新生代占堆的1/3,老年代占2/3),根据应用特点优化(如频繁创建对象的场景可适当增大新生代)。

五、启用HTTP压缩

在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"/>

0
看了该问题的人还看了