CentOS Tomcat日志中SQL异常排查与修复指南
一、快速定位与通用排查
- 从 Tomcat 日志(catalina.out、localhost.*.log) 抓取完整的异常栈与 SQL 语句,优先定位是语法、连接、权限还是数据问题。
- 将报错的 SQL 在数据库客户端直接执行,验证是否能复现;同时核对 表名/列名/别名 与数据库实际对象一致。
- 检查应用配置 JDBC URL、用户名、密码、驱动类名 是否正确;确认 数据库服务可达(主机、端口、网络、防火墙/SELinux)。
- 核对 JDBC 驱动版本 与数据库版本是否兼容;必要时查看 数据库错误日志 获取更详细线索。
- 若使用连接池(如 DBCP、HikariCP、Druid),打开 连接泄漏检测、获取连接超时、空闲校验 等日志与参数,便于发现连接层面的问题。
二、常见异常与对应修复
- 语法/对象不存在类异常(如:SQLSyntaxErrorException、Table ‘xxx’ doesn’t exist)
- 典型根因:SQL 语法错误、字段/表名拼写错误、参数缺失;在 Linux/MySQL 环境下常见 表名大小写敏感 导致“对象不存在”。
- 处理要点:在 DB 客户端执行 SQL 复核;统一对象命名(建议小写并加引号或统一约定);必要时修正 ORM/SQL 映射文件中的大小写。
- 连接被拒/认证失败(如:Access denied for user ‘root’@‘…’)
- 典型根因:账号或密码错误、无远程访问权限、主机限制。
- 处理要点:核对 application.properties/application.yml 或 context.xml 中的 username/password;在数据库授予相应用户 远程访问权限 并刷新权限。
- Host 被阻塞(如:Host ‘x.x.x.x’ is blocked because of many connection errors)
- 典型根因:短时间内大量失败连接触发 max_connect_errors 保护。
- 处理要点:执行 FLUSH HOSTS; 或调整 max_connect_errors;同时修复导致失败的根因(错误密码、网络抖动等)。
- 连接超时/通讯中断(如:Communications link failure、errorCode 17002/SQLRecoverableException、IO Error: Connection reset)
- 典型根因:数据库 wait_timeout 回收空闲连接而连接池仍持有;网络 DNS 解析异常 或防火墙/安全组阻断;数据库负载或会话上限。
- 处理要点:
- 连接池启用 testWhileIdle + validationQuery(SELECT 1),合理设置 timeBetweenEvictionRunsMillis/minEvictableIdleTimeMillis,避免拿到已被数据库关闭的连接;
- 优化 wait_timeout 与连接池的 maxIdle/minIdle/maxActive 配合;
- 检查 /etc/resolv.conf 的 DNS 是否可达,必要时注释无效 DNS,或在 /etc/hosts 配置数据库 IP-主机名 映射;
- 复核数据库 max_connections、当前会话数 与网络连通性。
三、连接池与数据库的关键配置示例
- 连接池(DBCP 示例,放在 Spring 或 Tomcat Resource 中)
- 关键参数:maxWait=3000(取连接最大等待毫秒)、initialSize=10、minIdle=10、maxIdle=150、maxActive=200;
- 健康检查:validationQuery=SELECT 1、testWhileIdle=true、testOnBorrow=false;
- 空闲回收:timeBetweenEvictionRunsMillis=30000、minEvictableIdleTimeMillis=1800000;
- 泄漏回收:removeAbandoned=true、removeAbandonedTimeout=180(单位秒)。
- MySQL 侧建议
- 适度提高 max_connect_errors(如 1000),并在异常后执行 FLUSH HOSTS;;
- 结合业务调整 wait_timeout,避免与应用连接池的空闲回收策略冲突。
- Oracle 侧建议
- 使用服务名连接字符串:jdbc:oracle:thin:@//:1521/<SERVICE_NAME>;
- 若使用 SID,确保 listener.ora 已正确配置对应 SID。
四、Linux与网络层面的检查清单
- 解析与连通性:
- 校验 /etc/resolv.conf 中 DNS 可达;必要时注释无效 DNS;在 /etc/hosts 增加数据库 IP-主机名 映射;
- 使用 telnet <DB_HOST> 或 nc -vz <DB_HOST> 测试端口连通;
- 复核 firewalld/iptables 与云安全组策略是否放行数据库端口。
- 系统资源与句柄:
- 若出现 Too many open files,提升进程可打开文件数(如 ulimit -n 65535),并优化连接池与业务连接使用,避免句柄泄漏。
五、最小可行修复流程
- 从 Tomcat 日志 复制完整异常栈与 SQL,在数据库客户端直接执行复现。
- 若是 SQLSyntaxErrorException/对象不存在:修正 SQL、统一 大小写、核对 ORM 映射。
- 若是 Access denied:核对 账号/密码/权限/主机限制 并修复。
- 若是 Host is blocked:执行 FLUSH HOSTS; 并调大 max_connect_errors,同时消除失败根因。
- 若是 Communications link failure/17002/Connection reset:
- 连接池开启 testWhileIdle + validationQuery,调整 wait_timeout 与池参数;
- 校验 DNS/hosts 与网络连通性,排除防火墙/安全组阻断。
- 回归压测与监控:观察 连接数、活跃线程、错误率、响应时延,确认问题消除且未引入新瓶颈。